C# - 将参数约束为Type的实例

时间:2012-06-28 19:43:48

标签: c# types constraints

我想创建一个将Dictionary映射到Type的{​​{1}},但我希望这些键是来自特定父类的类型。所以我想做一些事情:

Action

class Container { private Dictionary<Type, Action> dict; public void AddAction(Type t, Action a) where t : typeof(SomeParentClass) { dict[t] = a; } } 方法只接受AddAction的值,这些值是某些特定类的子类的类。我已经在Java中用t关键字看到了这样的事情,但我无法弄清楚如何在C#中做到这一点,如果它甚至可能的话。

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

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

这样的东西
extends

其中service.RegisterInterest(typeof(MyEvent), myAction) 的类型为myAction(我没有在原帖中添加,但应该使用普通Action<MyEvent>)。

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

Action

这会导致调用上述注册的所有service.TriggerEvent(typeof(MyEvent)) 个实例...实际上,Action<MyEvent>Dictionary映射到Type,而不是List<Action<Event>> Action 1}}。

4 个答案:

答案 0 :(得分:6)

如果需要编译时检查,可以使用泛型:

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

您可能还想保留非通用版本

public void AddAction(Type t, Action a)
{
    if(! typeof(SomeClass).IsAssignableFrom(t)) throw new ArgumentException();
    dict[t] = a;
}

答案 1 :(得分:2)

我会选择这样的事情:

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;
    }
}

答案 2 :(得分:0)

而不是Type t,请使用SomeParentClass t作为参数

答案 3 :(得分:0)

为方法添加断言。

Debug.Assert(t.IsAssignableFrom(typeof(SomeParentClass)));