0

让我们T成为一个泛型类型。我想做这样的事情:

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

当然,可以限制T为具有这种构造函数的类型,但我不想排除值类型。

你怎么能那样做?

4

2 回答 2

2

你必须使用反射:

ConstructorInfo ci = typeof(T).GetConstructor(Type.EmptyTypes);
if (ci != null)
    x = (T)ci.Invoke(null);

您也可以使用Activator.CreateInstance<T>(),但如果构造函数不存在,则会引发异常。

于 2012-07-25T18:59:45.090 回答
0

编辑:

该问题指出

当然,可以将 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();
于 2012-07-25T18:56:47.033 回答