我有一个情况我有接受其泛型类型参数的某个对象类型的实例类。 布局是这样的:
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
对象,但我想避免,如果可能的话,因为它失去了任何类型的安全和智能的支持。)