这不合法:
public class MyBaseClass
{
public MyBaseClass() {}
public MyBaseClass(object arg) {}
}
public void ThisIsANoNo<T>() where T : MyBaseClass
{
T foo = new T("whoops!");
}
为了做到这一点,你必须对T的类型对象做一些反思,或者你必须使用Activator.CreateInstance。两者都非常讨厌。还有更好的方法吗?
答案 0 :(得分:2)
不。如果您没有传入参数,那么您可以约束类型参数以要求无参数构造函数。但是,如果你需要传递参数,那你就不幸了。
答案 1 :(得分:1)
您不能将T约束为具有除空构造函数之外的特定构造函数签名,但您可以将T约束为具有所需签名的工厂方法:
public abstract class MyBaseClass
{
protected MyBaseClass() {}
protected abstract MyBaseClass CreateFromObject(object arg);
}
public void ThisWorksButIsntGreat<T>() where T : MyBaseClass, new()
{
T foo = new T().CreateFromObject("whoopee!") as T;
}
但是,我建议在这种情况下使用不同的创作模式,例如抽象工厂。
答案 2 :(得分:0)
where T : MyBaseClass, new()
仅适用于无参数的公共构造函数。除此之外,回到activator.CreateInstance(这真的不是那么糟糕)。
答案 3 :(得分:-2)
我可以看到它不起作用。
但是什么阻止你做这件事?
public void ThisIsANoNo<T>() where T : MyBaseClass
{
MyBaseClass foo = new MyBaseClass("whoops!");
}
既然一切都将从MyBaseClass继承,那么它们将是MyBaseClass,对吗?
我试过了,这很有效。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ThisIsANoNo<MyClass>();
ThisIsANoNo<MyBaseClass>();
}
public class MyBaseClass
{
public MyBaseClass() { }
public MyBaseClass(object arg) { }
}
public class MyClass :MyBaseClass
{
public MyClass() { }
public MyClass(object arg, Object arg2) { }
}
public static void ThisIsANoNo<T>() where T : MyBaseClass
{
MyBaseClass foo = new MyBaseClass("whoops!");
}
}
}