我有一个情况,其中一个类在其泛型类型参数中接受某种对象类型的实例。布局大致如下:
public abstract BaseClass { ... }
public DiamondClass : BaseClass { ... }
public SilverClass : BaseClass { ... }
public Handler<T> where T : BaseClass { ... }
我希望能够创建一个方法来返回Handler<DiamondClass>
或Handler<BaseClass>
的实例,而不需要在输入时定义类型。我已经尝试过类似这样的方法:
public Handler<BaseClass> GetHandler(HandlerType type)
{
switch(type)
{
case HandlerType.Diamond: return new Handler<DiamondClass>();
case HandlerType.Silver: return new Handler<SilverClass>();
default: throw new InvalidOperationException("...");
}
}
但是这样行不通,因为显然
Handler<DiamondClass>
不能隐式转换为 Handler<BaseClass>
。我可以这样指定:public Handler<T> GetHandler<T>(HandlerType type) where T : BaseClass
{
switch(type)
{
case HandlerType.Diamond: return (Handler<T>)new Handler<DiamondClass>();
case HandlerType.Silver: return (Handler<T>)new Handler<SilverClass>();
default: throw new InvalidOperationException("...");
}
}
但现在我需要调用GetHandler<DiamondClass>
或者GetHandler<BaseClass>
。这违背了根据枚举返回正确处理程序的方法而不知道类型的目的。我希望能够定义一个Type
对象并传递它,如下所示:
Type objType = typeof(DiamondClass);
var handler = Handler<objType>();
但显然C#不允许这种愚蠢的做法。我已经尝试了几种不同的方式来实现它,但我被卡住了。
(实际上,我通过返回一个dynamic
对象使其工作,但如果可能的话,我想避免使用它,因为它失去了任何类型安全和Intellisense支持。)