例如,我有一个基类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中定义一些内容以使最后一个语句起作用?
答案 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()
约束除外,它需要无参数构造函数)。