如何创建操作列表<t>

时间:2018-03-16 04:11:44

标签: c# generics lambda delegates

我想用字典(Type,Action(T))创建各种事件中心。这将允许我根据给定对象的类型查找操作并运行正确的操作。但是编译器不喜欢我在同一个字典中有不同类型的操作。所以我尝试使用动态类型操作,但在尝试将T转换为动态时仍然给出了错误。然后我尝试在泛型上添加一个约束,这样一切都来自同一个抽象基类,但也没有解决问题。

有没有办法让这项工作?只要你注册方法而不是每次通话都能获得大的性能,我就可以使用像反射这样的东西。

var functions = Dictionary<Type, Action<dynamic>>();

void RegisterHandler<T>(Action<T> handler)
    where T : BaseClass
{
    functions.Add(typeof(T), handler);
}

void CallMethod<T>(T data)
{
    functions[data.GetType()].Invoke(data);
}

1 个答案:

答案 0 :(得分:0)

经过更多的游戏,我发现了一个可以编译的解决方案。我还没有对此进行测试,看它是否会产生很大的性能影响。如果你能改进这一点,请告诉我。

    var functions = Dictionary<Type, Action<dynamic>>();

    void RegisterDynamicHandler<T>(Action<dynamic> handler)
    {
        Functions.Add(typeof(T), handler);
    }

    public void RegisterHandler<T>(Action<T> handler)
        where T : BaseClass
    {
        if (functions.ContainsKey(typeof(T)))
            throw new RegisterHandlerException();

        Action<dynamic> dynamicAction = (Action<dynamic>)handler;
        RegisterDynamicHandler<T>(dynamicAction);
    }