我想要一个委托字典,其中的关键是委托采用的参数类型。
但是,除了对值类型使用object
之外,我找不到任何其他选项:
Dictionary<Type, object> delegates;
我可以这样添加委托:
public void AddListener<T>(MyDelegateType<T> listener)
{
delegates[typeof(T)] = listener;
}
这迫使我的invoke代码看起来像这样:
public void Emit(object argument)
{
var target = delegates[argument.GetType()];
target.GetType().GetMethod("Invoke").Invoke(target, new object[] { argument });
}
如果我在编译时知道参数的类型,我可以稍微好一点:
public void Emit<T>(T argument)
{
var target = (MyDelegateType<T>) delegates[typeof(T)];
target.Invoke(argument);
}
有没有更好的方法可以在编译时使用或不使用参数类型?
如果每个委托都是MyDelegateType
,则可以添加类似MyDelegateType
的基类和更好的接口IMyDelegateType
。因此您字典将是dictionary<;type,imydelegateType>;委托;
。
如果您喜欢使用实体,则应在目标类型中实现接口,如果此类型不是您的类型,则应使用扩展方法。您还可以使用具有目标对象作为元素的类。