确定泛型类型是否具有标准构造函数

时间:2012-07-25 18:53:12

标签: c# generics reflection constructor

T成为通用类型。我想做这样的事情:

T x = default(T);
if (T has standard constructor)
  x = new T();

当然,可以将T限制为具有此类构造函数的类型,但我不希望排除值类型。

你怎么能这样做?

2 个答案:

答案 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();