提问者:小点点

用键型参数实现委托字典


我想要一个委托字典,其中的关键是委托采用的参数类型。

但是,除了对值类型使用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);
}

有没有更好的方法可以在编译时使用或不使用参数类型?


共1个答案

匿名用户

如果每个委托都是MyDelegateType,则可以添加类似MyDelegateType的基类和更好的接口IMyDelegateType。因此您字典将是dictionary<;type,imydelegateType>;委托;
如果您喜欢使用实体,则应在目标类型中实现接口,如果此类型不是您的类型,则应使用扩展方法。您还可以使用具有目标对象作为元素的类。