在C#中,我可以从T转换为T:new()

时间:2016-04-18 03:27:09

标签: c# generics

这是我的代码:

void DoSomething<T>()
{
    var constructor = typeof(T).GetConstructor(null);

    if(constructor != null)
    {
        DoSomethingElse<T>(); // compiler error
    }
    else
    {
        //...   
    }

}

void DoSomethingElse<T>() where T:new()
{
   T x = new T();
   //...
}

有没有办法说服编译器T是合法的T:new()?

1 个答案:

答案 0 :(得分:4)

除了添加new()约束之外,没有办法说服编译器,如果你不能这样做,唯一的方法是使用Reflection

var methodType = // get the type of DoSomethingElse here
var genericMethod = methodType.MakeGenericMethod(typeof(T));

// pass instance instead of null if this is an instance method
genericMethod.Invoke(null);