在不知道类型的情况下返回通用

我有一种情况,我有一个类,在其generics类型参数中接受某个对象类型的实例。 布局是这样的:

public abstract BaseClass { ... } public DiamondClass : BaseClass { ... } public SilverClass : BaseClass { ... } public Handler where T : BaseClass { ... } 

我希望能够创建一个方法来返回HandlerHandler的实例,而无需在输入时定义类型。 我试过这些方面的东西:

 public Handler GetHandler(HandlerType type) { switch(type) { case HandlerType.Diamond: return new Handler(); case HandlerType.Silver: return new Handler(); default: throw new InvalidOperationException("..."); } } 

但这不起作用,因为显然Handler不会隐式转换为Handler 。 我可以这样指定:

 public Handler GetHandler(HandlerType type) where T : BaseClass { switch(type) { case HandlerType.Diamond: return (Handler)new Handler(); case HandlerType.Silver: return (Handler)new Handler(); default: throw new InvalidOperationException("..."); } } 

但现在我需要调用GetHandlerGetHandler 。 这就违背了一个方法,即在不知道类型的情况下返回基于枚举的正确处理程序的目的。 我希望我可以定义一个Type对象并传递它,如下:

  Type objType = typeof(DiamondClass); var handler = Handler(); 

但显然C#不会允许那种愚蠢。 我已经走了几个不同的方式,我想有办法做到这一点,但我很难过。


(我确实通过返回一个dynamic对象来实现这个function,但是如果可能的话,我想避免使用它,因为它会丢失任何类型的安全性和Intellisense支持。)

这是协方差发挥作用的地方,协方差和反方差只适用于接口和委托,因此,为了解决您的问题,只需将新接口IHandler定义为IHandler -variant with out ,指定类型参数为co -variant:

 public interface IHandler where T : BaseClass { } 

具有协变类型参数的接口使其方法能够返回比type参数指定的类型更多的派生类型

它会工作。 更多信息在这里