変数の型が変数に格納されている型と一致するかどうかを確認する方法


96
User u = new User();
Type t = typeof(User);

u is User -> returns true

u is t -> compilation error

このようにして、いくつかの変数があるタイプかどうかをテストするにはどうすればよいですか?

回答:


194

他のすべての回答には重要な欠落が含まれています。

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 b5 = x.GetType() == typeof(Tiger); // true
bool b6 = x.GetType() == typeof(Animal); // false! even though x is an animal

or with the type variable
bool b7 = t == typeof(Tiger); // true
bool b8 = t == typeof(Animal); // false! even though x is an 

それがあなたの望んでいないことなら、おそらくIsAssignableFromが必要です:

bool b9 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b10 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.

or with the type variable
bool b11 = t.IsAssignableFrom(x.GetType()); // true
bool b12 = t.IsAssignableFrom(x.GetType()); // true! A 

4
ここに示す最後のアプローチは機能しますが、不必要に冗長です。typeof(Animal).IsInstanceOfType(x)はより短くて簡単ですtypeof(Animal).IsAssignableFrom(x.GetType());(後者を使用する場合は、Resharperが前者の使用を推奨します)。
マークアメリー2017年

明確化:元の質問に答えるには、の代わりに使用tしてくださいtypeof(Animal)。したがって、マークの改良された形式はになりt.IsInstanceOfType(x)ます。
ToolmakerSteve

13

GetType() ベース上で定義されているため、すべての単一のフレームワークタイプに存在します。 objectタイプでます。そのため、タイプ自体に関係なく、それを使用して基になるType

だから、あなたがする必要があるのは、

u.GetType() == t

1
実際にはエリックの答えは役に立ちますが、元の質問で説明されている「u is t」の方法で不明なタイプをテストする方法の実際の質問には答えませんが、あなたの答えはそうです。
Daniel

@Daniel-厳密には違います。Daveの答えは、tのサブクラスを除外する場合にのみ正しいです。エリックの答えは主に何をすべきかを説明しています。"t"を置く場所の明確化が欠けているだけです。そこにコメントを追加します。
ToolmakerSteve

10

インスタンスのTypeがクラスのTypeと等しいかどうかを確認する必要があります。インスタンスのタイプを取得するには、GetType()メソッドを使用します。

 u.GetType().Equals(t);

または

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

それを行う必要があります。もちろん、必要に応じて「==」を使用して比較を行うこともできます。


+1しかし、2番目の選択を優先します。u.GetType.Equals(typeof(User));
オマール

==を使用するよりも安全性が低い理由の1つは、GetType()が何らかの理由でnullを返した場合にスローされることです。
Dave Bish、2012年

1
@Fuex、そうですね、typeofがインラインの場合はコードが読みやすくなると思います。そのため、OPsの例でtは型を含む変数をすでに持っていますが、そのように投稿しました。
サムホルダー

@DaveBish GetTypeがnullを返した場合、多くのことがスローされ始めるのではないかと心配になります...しかし、要点は当然です
サムホルダー

@SamHolderええ-これが起こる唯一の状況は、誰かが基本型を上書きして、なんらかの方法で実装を台無しにした場合です。確かに変だ。
Dave Bish、2012年

4

オブジェクトが指定された型変数と互換性があるかどうかを確認するために、

u is t

あなたは書くべきです

typeof(t).IsInstanceOfType(u)

1
「u is t」構文と比べてより冗長な構文の利点は何ですか?
カイルハンフェルド2016

@KyleHumfeldタイプfooの場合。オブジェクトA; 「A is foo」は記述できませんが、foo.isInstanceOfType(A)は記述できます
Timur Nuriyasov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.