2011-09-28 5 views
38

私は、Tが参照型または値型に依存する一般的なメソッド動作を持っています。それはとても見えます:彼らの署名が等しいのでTが汎用クラスの値型か参照クラスかどうかを判断する方法は?

T SomeGenericMethod <T> (T obj) where T : class 
{ 
//Do one stuff 
} 

T SomeGenericMethod <T> (T obj) where T : struct 
{ 
//Do another stuff 
} 

T SomeGenericMethod <T> (T obj) 
{ 
    if (T is class) //What condition I must write in the brackets? 
    //to do one stuff 
    else //if T is a value type like struct, int, enum and etc. 
    //to do another stuff 
} 

私は次のように、このメソッドを複製することはできません。誰でも助けてくれますか?

答えて

62

あなたはとてもtypeof(T)Tに対応Typeの参照を取得し、その後使用し、一般的なタイプでtypeof operatorを使用することができますIsValueTypeプロパティ:

if (typeof(T).IsValueType) 

それとも、NULL可能値の型を含める場合かのように彼ら我々参照型:

+1

null可能な値の型に関する追加説明をいただきありがとうございます。 – mkus

+0

2番目のオプションは、値の型とnullの可能な比較です。これはReSharperが好きなものです。その周りには何か方法はありますか? – bubbleking

+0

@ bubbleking:それはあなたが達成しようとしているものによって、実際には... –

6

Type.IsValueTypeは、当然、Typeが値の種類であるとします。従って、typeof(T).IsValueType

6

[以下の答えはT静的タイプが、objダイナミックタイプをチェックしません。これは、あなたが尋ねたが、それはとにかく、あなたの問題のために有用であるかもしれないので、私は参考のために、この答えをしておこう正確何ではありません。]

すべての値の種類(とのみ)System.ValueTypeから派生します。したがって、次の条件を使用することができます。

if (obj is ValueType) { 
    ... 
} else { 
    ... 
} 
+0

Tは型であり式ではないので、 'is'を使うことはできません。また、 'T'がどこの参照型であるSystem.ValueTypeであるかを考えてみてください。 –

+0

@JonSkeet:ありがとう、良い点は' obj is ValueType'に変更されました。 'ValueType'は抽象クラスであるため、' obj'は正確に 'ValueType'にはなりません(もちろん、これは' obj'がnullではないと仮定します...私はそれを私の答えに追加します)。 – Heinzi

+0

それは 'T'についてあなたに言わない。 'SomeGenericMethod (null)' - 'int?'は値型ですが、条件が一致しないと考えてください。 –

4

これを試してみてください。

if (typeof(T).IsValueType) 
関連する問題