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

时间:2014-11-01 01:17:55

标签: c#

我希望能够在C#中编写一个方法,类似于我在Java中的方式...传递一个Class对象,它是某些超类的子类...但我能做到最好find for C#如下:

public void someMethod(Type t) {
  if (t == typeof(SomeType)) ...
}

我是否可以在方法签名中强制执行参数必须是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) ...
  }
}

4 个答案:

答案 0 :(得分:9)

您可以使用通用约束。

public void someMethod<T>() where T : SomeType {
    Type myType = typeof(T);

    // do something with myType
}

这是您所需用例的实现。

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

你会这样称呼它。

var em = new EventManager();
EventHandler eh = null; // or whatever
em.RegisterEventHandler<SpecificEventType>(eh);

答案 1 :(得分:1)

我真的不懂java,但你的意思是这样吗?

namespace ConsoleApplication1
{
    class bar
    { public void stuff() { } }

    class foo : bar
    { }

    class doublefoo : bar
    { }

    class Program
    {
        static void Main(string[] args)
        {
            someMethod<foo>();
            someMethod<doublefoo>();
        }

        public static void someMethod<t>() where t: bar, new()
        {
            t myBar = new t();

            myBar.stuff();
        }
    }
}

答案 2 :(得分:1)

您可以通过定义泛型类型来实现此行为。

public void SomeMethod<T>(T obj) where T : AbstractClass
{
}

但是没有什么能阻止你只使用基类作为参数

public void SomeMethod(AbstractClass obj)
{
}

答案 3 :(得分:1)

正如其他人所说,你可以使用泛型类型参数来做到这一点......但是如果你只有Type的值,并希望将其作为常规参数传递(例如因为它&#39已经被传递给你的方法),没有办法做到这一点。 Type在.NET中不是通用的,因此没有将参数约束为表示特定类或其子类的Type的概念,就像在那里一样。没有将字符串参数约束为一定长度或更长的概念。

如果您在调用方法时 在编译时知道类型,那么根据recursive's answer使用泛型类型参数绝对是可行的方法。