是否可以创建构造函数的模板?

时间:2015-03-18 22:43:35

标签: c#

例如,我有一个基类A和一些子类,B和C

public class A
{
    protected string data;
    public A(string s)
    {
        this.LoadFromString(s);
    }
    public virtual void LoadFromString(string s)
    {
        data = s;
    }
    public static T CreateInstance<T>(string s) where T : A, new()
    {
        T instance = new T();
        instance.LoadFromString(s);
        return instance;
    }

}
public class B : A
{

}

public class C : A
{

}

现在我想要B和C的实例,

class Program
{
    static void Main(string[] args)
    {
        string s = "111";
        //works
        B bb = B.CreateInstance<B>(s);
        //do not work
        C cc = new C(s);
        //do not work
        C cc = C.CreateInstance(s);
    }
}

是否可以在A中定义一些内容以使最后一个语句起作用?

1 个答案:

答案 0 :(得分:1)

  

是否可以在A中定义一些内容以使最后一个语句起作用?

没有。您需要在C中执行一些操作(添加构造函数)以使第二个选项有效:

public class C
{
     // Note that this is required anyways - it won't compile without
     // a constructor that calls into base(string) anyways...
     public C() : base("") {}

     // This constructor will allow you to use new C(str)
     public C(string s) : base(s) {}
}

为了使第三个选项有效,您需要指定类型:

C cc = C.CreateInstance<C>();

这是因为在这种情况下C.CreateInstance实际上与A.CreateInstance完全相同,因此以上内容编译为:

C cc = A.CreateInstance<C>();

C#中没有办法创建对构造函数有效的泛型约束(new()约束除外,它需要无参数构造函数)。