[英]C# equivalent of Java Class<? extends Base>?
我希望能够在C#中编写一个方法,类似于我在Java中的方式...传入一个Class对象,它是一些超类的子类...但我能找到的最好的C#是以下:
public void someMethod(Type t) {
if (t == typeof(SomeType)) ...
}
有什么方法可以在方法签名中强制执行参数必须是SomeType类型或其继承者之一?
我不打算传递所述类型的实例。 我想将Type本身作为参数传递。
这是一个背景。
我想创建一个EventManager类,它包含一个Dictionary<SomeEventType, ICollection<EventHandler>>
对象,以及一个方法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) ...
}
}
您可以使用通用约束。
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);
我真的不懂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();
}
}
}
您可以通过定义泛型类型来实现此行为。
public void SomeMethod<T>(T obj) where T : AbstractClass
{
}
但是没有什么能阻止你只使用基类作为参数
public void SomeMethod(AbstractClass obj)
{
}
正如其他人所说的那样,你可以使用泛型类型参数来做到这一点......但是如果你只将值作为一个Type
并希望将其作为常规参数传递(例如因为它已经以这种方式传递给你的方法),没有办法做到这一点。 Type
在.NET中不是通用的,因此没有将参数约束为表示特定类或其子类的Type
的概念,就像没有将字符串参数约束为特定长度或更长的概念一样。
如果您在调用方法时确实知道编译时的类型,那么根据递归的答案使用泛型类型参数绝对是可行的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.