2016-04-18 7 views
0

ここに私のコードです:新しい():は私がTでのTからキャストすることができます。新しい()

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であるコンパイラを説得する方法はありますか?

+0

も、ありません。明らかに、コンパイラはそのようには動作しません:)最初のメソッドにも 'new()'制約を追加する必要があります。 –

+0

できません。 DoSomethingは、デフォルトコンストラクタを持つものだけでなく、すべての型で動作する必要があります。 –

+0

ええと、あなたは、反射を使って 'DoSomethingElse'を呼び出すことができます。 –

答えて

4

あなたが唯一の方法はReflectionに行くことであることを行うことができない場合は、new()制約を加えること以外のコンパイラを説得する方法はありません。

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); 
関連する問題