web-dev-qa-db-ja.com

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

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

u is User -> returns true

u is t -> compilation error

この方法で変数のタイプをテストするにはどうすればよいですか?

86
Karan

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

is演算子はnotオペランドの実行時の型が正確に指定された型であるかどうかを確認します。むしろ、ランタイムタイプ互換性がある指定されたタイプかどうかを確認します。

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.

ただし、タイプidentityのチェックでは、compatibilityではなくidentityのリフレクションチェックを使用します。

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.
185
Eric Lippert

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

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

u.GetType() == t
13
Dave Bish

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

 u.GetType().Equals(t);

または

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

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

9
Sam Holder

書く代わりに、オブジェクトが与えられた型変数と互換性があるかどうかをチェックするため

u is t

あなたは書くべきです

typeof(t).IsInstanceOfType(u)
4