让我们T
成为一个泛型类型。我想做这样的事情:
T x = default(T);
if (T has standard constructor)
x = new T();
当然,可以限制T
为具有这种构造函数的类型,但我不想排除值类型。
你怎么能那样做?
让我们T
成为一个泛型类型。我想做这样的事情:
T x = default(T);
if (T has standard constructor)
x = new T();
当然,可以限制T
为具有这种构造函数的类型,但我不想排除值类型。
你怎么能那样做?
你必须使用反射:
ConstructorInfo ci = typeof(T).GetConstructor(Type.EmptyTypes);
if (ci != null)
x = (T)ci.Invoke(null);
您也可以使用Activator.CreateInstance<T>()
,但如果构造函数不存在,则会引发异常。
编辑:
该问题指出
当然,可以将 T 限制为具有这种构造函数的类型,但我不想排除值类型。
使用下面显示的约束不限T
于引用类型。如果您出于其他原因需要支持其他构造函数,请更新您的问题。
(预编辑:毕竟可能不适用于问题)
您正在寻找一个new
约束(也称为无参数构造函数约束):
class YourClass<T> where T : new()
{
public T doSomething()
{
return new T();
}
}
T
绝对允许作为值类型,例如:
YourClass<char> c = new YourClass<char>();
char result = c.doSomething();