C#相当于Java Class <?扩展Base>?

age*_*154 4 c#

我希望能够在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)

rec*_*ive 9

您可以使用通用约束.

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)