我想用字典(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);
}
答案 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);
}