toa*_*ven 1 c# types constraints
我想创建一个Dictionary映射Type到一个Action,但我希望键是来自特定父类的类型.所以我想做一些事情:
class Container
{
private Dictionary<Type, Action> dict;
public void AddAction(Type t, Action a) where t : typeof(SomeParentClass)
{
dict[t] = a;
}
}
Run Code Online (Sandbox Code Playgroud)
凡AddAction方法只接受值t是的类,有一些具体的类的子类的类型.我已经在Java中看到过这样的extends关键字,但我无法弄清楚如何在C#中做到这一点,如果它甚至可能的话.
编辑:为了澄清,我不希望AddAction方法接受SomeParentClass的实例,而是希望SomeParentClass的子类的类的类型.有没有比使用类型更好的方法?
编辑:我实际上要做的是创建一个调度服务,其中应用程序的各个部分可以注册对事件类型的兴趣,并提供在触发该类型的事件时调用的Action.想象一下像
service.RegisterInterest(typeof(MyEvent), myAction)
Run Code Online (Sandbox Code Playgroud)
myAction类型在哪里Action<MyEvent>(我没有把它放在原帖中但应该有而不是普通的Action).
然后应用程序的其他部分可以做
service.TriggerEvent(typeof(MyEvent))
Run Code Online (Sandbox Code Playgroud)
这会导致Action<MyEvent>调用上面注册的所有实例...所以实际上Dictionary将a映射Type到a List<Action<Event>>而不是单个Action.
如果需要编译时检查,可以使用泛型:
public void AddAction<T>(Action a) where T : SomeParentClass
{
dict[typeof(T)] = a;
}
Run Code Online (Sandbox Code Playgroud)
您可能还想保留非通用版本
public void AddAction(Type t, Action a)
{
if(! typeof(SomeClass).IsAssignableFrom(t)) throw new ArgumentException();
dict[t] = a;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |