답변:
다른 답변에는 모두 중요한 누락이 포함되어 있습니다.
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.
그러나 리플렉션을 사용 하여 유형 ID 를 확인하는 것은 호환성이 아닌 ID를 확인합니다.
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
t
위해 typeof(Animal)
. 따라서 Mark의 개선 된 형태는 t.IsInstanceOfType(x)
.
GetType()
기본 object
유형 에 정의되어 있으므로 모든 단일 프레임 워크 유형에 존재 합니다. 따라서 유형 자체에 관계없이이를 사용하여 기본Type
따라서 다음과 같이하면됩니다.
u.GetType() == t
인스턴스의 유형이 클래스의 유형과 같은지 확인해야합니다. 인스턴스 유형을 가져 오려면 다음 GetType()
메소드 를 사용하십시오 .
u.GetType().Equals(t);
또는
u.GetType.Equals(typeof(User));
해야합니다. 원하는 경우 비교를 위해 '=='를 사용할 수 있습니다.
u.GetType.Equals(typeof(User));
t
유형을 포함 하는 변수 를 가지고 있음에도 불구하고 그렇게 게시했습니다 .
객체가 작성하는 대신 주어진 유형 변수와 호환되는지 확인하기 위해
u is t
너는 써야한다
typeof(t).IsInstanceOfType(u)
typeof(Animal).IsInstanceOfType(x)
보다 짧고 간단합니다typeof(Animal).IsAssignableFrom(x.GetType());
(후자를 사용하는 경우 Resharper에서 전자 사용을 제안합니다).