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