注意:为了编写一个相当短的问题,我创建了一个类似于我的应用程序的问题区域的示例。实际的例子比较复杂,但问题陈述是准确的。
假设我有一个抽象基类:
public abstract class AnalysisObject
{
public virtual AnalysisObject CreateObject(int id, string description)
{ return null; }
//Some other virtual methods in here
}
我从中派生了一些包含特定于某些AnalysisObject类型的行为的类。例如:
public class HWAnalysisObject : AnalysisObject {
public override AnalysisObject CreateObject(int id, string description)
{
return new HWAnalysisObject();
}
//override more virtual methods to provide specific behavior
}
现在,我想编写一个可以在AnalysisObjects上运行的通用服务。在这个服务中,我在某些时候需要创建并返回AnalysisObject的新子类型。我无法弄清楚如何做到这一点。
public class AOService<TAnalysisObject> where TAnalysisObject : AnalysisObject
{
public AnalysisObject FetchObject(int id)
{
return TAnalysisObject.CreateObject(id, "new object");
}
显然不能编译: “TAnalysisObject是一个类型参数,在此上下文中无效。”
足够公平。但是我如何使用我传递给我的服务类型的属性等,所以我知道要返回什么类型的子类?我觉得我在这里缺少Generics 101,这很公平,因为我通常使用泛型类和服务,我不写它们。
我可以在服务中粘贴一个看起来像这样的方法:
private AnalysisObject MakeAnalysisObject(int id, string description)
{
if ( (typeof(TAnalysisObject) == typeof(HWAnalysisObject) )
{
return new HWAnalysisObject(id, description);
}
if ( (typeof(TAnalysisObject) == typeof(MMAnalysisObject) )
{
return new MMAnalysisObject(id, description);
}
//etc
}
但是我认为这违背了为什么我尝试泛型的目的:现在我不能只得到更多的AnalysisObject并让服务能够处理它们:我每次添加时都必须在服务中维护这个方法一种新型。
答案 0 :(得分:2)
new()
约束意味着您的类需要具有无参数构造函数。然后,您可以使用new T();
创建一个新的。但是,除了无参数构造函数之外,没有办法强制执行另一个。
public class AOService<TAnalysisObject> where TAnalysisObject : AnalysisObject, new()
{
public AnalysisObject FetchObject(int id)
{
return new TAnalysisObject();
}
}