我想创建一个将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}}。
答案 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)));