2012-05-02 14 views

答えて

153

その他の回答にはすべて重大な欠落が含まれています。オペランドのランタイム型が正確指定されたタイプである場合

isオペレータはないチェックを行います。

class Animal {} 
class Tiger : Animal {} 
... 
object x = new Tiger(); 
bool b1 = x is Tiger; // true 
bool b2 = x is Animal; // true also! Every tiger is an animal. 

しかしアイデンティティため、ない互換性

bool b3 = x.GetType() == typeof(Tiger); // true 
bool b4 = x.GetType() == typeof(Animal); // false! even though x is an animal 
用反射チェックとタイプ アイデンティティのチェック:むしろ、それはランタイム型 指定されたタイプと互換性があるかどうかを確認し

それがあなたが望むものでないなら、おそらくIsAssignableFromが必要です:

bool b5 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true 
bool b6 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger. 
+1

ここに示した最終的なアプローチは機能しますが、不必要に冗長です。 'typeof(Animal).IsInstanceOfType(x)'は 'typeof(Animal).IsAssignableFrom(x.GetType());'よりも短く、より簡単です(後者を使うならResharperは前者を使うことを提案します)。 –

11

GetType()は、基本フレームobjectタイプで定義されているため、すべての単一フレームワークタイプに存在します。だから、タイプに関係なく自身の、あなたはそう根本的Type

を返すためにそれを使用することができ、すべてを行う必要がある:あなたのインスタンスのTypeと等しいかどうかを確認する必要が

u.GetType() == t 
+9

エリックの答えははるかに優れている - をお読みください。 –

+1

実際、エリックの答えは参考になりますが、元の質問に記載されている方法で未知のタイプでテストする方法の実際の質問には答えません。 – Daniel

7

クラスの型

u.GetType().Equals(t); 

または

u.GetType.Equals(typeof(User)); 

はそれを行う必要があります:インスタンスのタイプを取得するには、GetType()メソッドを使用します。明らかに、もしあなたが好きであれば '=='を使って比較を行うことができます。

+0

+1しかし、第二の選択肢を好む。 'u.GetType.Equals(typeof(User));' –

+0

これは、==を使うよりも安全性が低い理由の1つは、何とかGetType()が何らかの形でnullを返すと、それはスローされます。 –

+1

@Fuex、ええと私は、typeofがインラインであるとコードを読みやすくしていると思います。なぜなら、OPの例で彼はすでに型を含む変数 't'を持っています。 –

4

確認するために、オブジェクトが代わりに

u is t 

を書き込むので、与えられた型変数と互換性がある場合は、書くべき以下

typeof(t).IsInstanceOfType(u) 
+1

もっと冗長な構文と 'u is t'の構文の利点は何ですか? –

+0

@ KyleHumfeld Typeがfooの場合は、オブジェクトA;あなたは "A is foo"と書くことはできませんが、あなたはfoo.isInstanceOfType(A)と書くことができます。 –

関連する問題