【发布时间】:2012-09-19 11:09:34
【问题描述】:
我有一个类在其泛型类型参数中接受某个对象类型的实例。布局是这样的:
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 支持。)
【问题讨论】:
-
var handler = Handler<DiamondClass>();有什么问题,我看不出你要解决什么问题。 -
如果你必须检查泛型方法内部的类型,我总是会质疑这种方法的有用性。
-
@RobA 请记住,为了便于解释,我对示例进行了很多简化。部分问题是我希望它属于用户控件,我不能将其定义为通用的,因为它会扼杀设计者。
标签: c# generics inheritance types factory