如何在我的通用服务中实际使用泛型类型来创建新对象?

时间:2017-03-27 14:42:09

标签: c# generics

注意:为了编写一个相当短的问题,我创建了一个类似于我的应用程序的问题区域的示例。实际的例子比较复杂,但问题陈述是准确的。

假设我有一个抽象基类:

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并让服务能够处理它们:我每次添加时都必须在服务中维护这个方法一种新型。

1 个答案:

答案 0 :(得分:2)

new()约束意味着您的类需要具有无参数构造函数。然后,您可以使用new T();创建一个新的。但是,除了无参数构造函数之外,没有办法强制执行另一个。

public class AOService<TAnalysisObject> where TAnalysisObject : AnalysisObject, new()
{
    public AnalysisObject FetchObject(int id)
    {
        return new TAnalysisObject();
    }
}