1

我想创建将 aDictionary映射Type到 a 的a Action,但我希望键是来自特定父类的类型。所以我想做类似的事情:

class Container
{
    private Dictionary<Type, Action> dict;

    public void AddAction(Type t, Action a) where t : typeof(SomeParentClass)
    {
        dict[t] = a;
    }
}

AddAction方法仅接受t作为某些特定类的子类的类类型的值。我已经看到在 Java 中使用extends关键字完成了类似的操作,但如果可能的话,我无法弄清楚如何在 C# 中执行此操作。

编辑:为了澄清,我不希望 AddAction 方法采用 SomeParentClass 的实例,而是采用作为 SomeParentClass 子类的类的类型。有没有比使用类型更好的方法?

编辑:我实际上要做的是创建一个调度服务,其中应用程序的各个部分可以注册对 Event 类型的兴趣,并提供一个在触发该类型的事件时调用的 Action。所以想象一下

service.RegisterInterest(typeof(MyEvent), myAction)

Where myActionis of type Action<MyEvent>(我没有在原始帖子中放入但应该有而不是 plain 的东西Action)。

然后应用程序的其他部分可以做

service.TriggerEvent(typeof(MyEvent))

这会导致所有Action<MyEvent>按上述方式注册的实例都被调用......所以实际上Dictionary将 a 映射Type到 a List<Action<Event>>,而不是单个Action

4

4 回答 4

6

If you require compile-time checking you can use generics:

public void AddAction<T>(Action a) where T : SomeParentClass
{
    dict[typeof(T)] = a;
}

You may also want to keep the non-generic version

public void AddAction(Type t, Action a)
{
    if(! typeof(SomeClass).IsAssignableFrom(t)) throw new ArgumentException();
    dict[t] = a;
}
于 2012-06-28T19:52:12.753 回答
2

I'd go with something like this:

class Container
{
    private Dictionary<Type, Action> dict;

    public bool AddAction(Type t, Action a) 
    {
        if (typeof(SomeParentClass).IsAssignableFrom(t))
        { 
            dict[t] = a;
            return true;
        }
        return false;
    }
}
于 2012-06-28T19:53:02.953 回答
0

代替Type t,SomeParentClass t用作参数

于 2012-06-28T19:46:14.987 回答
0

向方法添加断言。

Debug.Assert(t.IsAssignableFrom(typeof(SomeParentClass)));
于 2012-06-28T19:57:05.247 回答