我希望能够在C#中编写一个方法,类似于我在Java中的方式...传入一个Class对象,它是一些超类的子类...但我能找到的最好的C#是以下:
public void someMethod(Type t) {
if (t == typeof(SomeType)) ...
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以在方法签名中强制执行参数必须是SomeType类型或其继承者之一?
我不打算传递所述类型的实例.我想将Type本身作为参数传递.
这是一个背景.
我想创建一个包含Dictionary<SomeEventType, ICollection<EventHandler>>对象的EventManager类,以及registerEventHandler(Type t, EventHandler eh)一个将给定映射Type到的方法EventHandler.
在Java中,我会这样做:
private static Map<Class<? extends Event>, Collection<EventHandler>> eventHandlers;
public static void registerListener(Class<? extends Event> event, EventHandler handler) {
if (eventHandlers.get(event) == null) {
HashMap<EventHandler> handlers = new HashMap<EventHandler>()
eventHandlers.put(event, handlers) ...
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用通用约束.
public void someMethod<T>() where T : SomeType {
Type myType = typeof(T);
// do something with myType
}
Run Code Online (Sandbox Code Playgroud)
这是您所需用例的实现.
class EventManager {
public Dictionary<Type, ICollection<EventHandler>>
HandlerMap = new Dictionary<Type, ICollection<EventHandler>>();
public void RegisterEventHandler<TEvent>(EventHandler eh)
where TEvent: SomeEventType
{
Type eventType = typeof(TEvent);
if (!HandlerMap.ContainsKey(eventType)) {
HandlerMap[eventType] = new List<EventHandler>();
}
HandlerMap[eventType].Add(eh);
}
}
Run Code Online (Sandbox Code Playgroud)
你会这样称呼它.
var em = new EventManager();
EventHandler eh = null; // or whatever
em.RegisterEventHandler<SpecificEventType>(eh);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2435 次 |
| 最近记录: |