c#实现事件机制的问题

k_light 发布于 2015/02/11 14:45
阅读 266
收藏 0

小弟初学c#,最近用c#实现了一个事件系统,核心功能包括事件注册和事件触发,例子如下:

//----------------------------------------------------------------------------------------------------
//Event.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;

class Event
{
    private class Method
    {
        public object obj;
        public MethodInfo methodInfo;

        public Method(object obj, MethodInfo methodInfo)
        {
            this.obj = obj;
            this.methodInfo = methodInfo;
        }
    }

    private static Dictionary<string, Method> _dictEvent = new Dictionary<string, Method>();

    public static bool register(string eventname, object obj, MethodInfo methodInfo)
    {
        _dictEvent[eventname] = new Method(obj, methodInfo);
        return true;
    }

    public static void fire(string eventname, object[] args)
    {
        Method method = _dictEvent[eventname];
        method.methodInfo.Invoke(method.obj, args);
    }
}


//----------------------------------------------------------------------------------------------------
//Avatar.cs
class Avatar
{
    public Avatar()
    {
        Event.register("eat", this, this.GetType().GetMethod("onEat"));
    }

    public void onEat(int type, int num)
    {
        //...
    }

    public void walk()
    {
        //...
        Event.fire("eat", new object[]{1, 100});
        //...
    }
}

经过测试发现,Invoke的效率不高,频繁调用的情况下严重影响性能,请教高手有没有更好的解决办法呢?

后面研究了一下delegate 委托,但是委托必须具体指明委托的函数类型,无法满足上面例子的要求(新添注册事件不需要修改Event.cs)。

加载中
0
0
k
k_light

引用来自“沐青衣”的评论

泛型委托
泛型委托也必须具体指定一种类型才行,不像MethodInfo那样,任何方法都可以用它进行描述。如果委托方法的类型不确定,那使用泛型委托也还是达不到需求。
返回顶部
顶部