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



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

最新更新