변수의 유형이 변수에 저장된 유형과 일치하는지 확인하는 방법


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.

그러나 리플렉션을 사용 하여 유형 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 

4
여기에 표시된 최종 접근 방식이 작동하지만 불필요하게 장황합니다. typeof(Animal).IsInstanceOfType(x)보다 짧고 간단합니다 typeof(Animal).IsAssignableFrom(x.GetType());(후자를 사용하는 경우 Resharper에서 전자 사용을 제안합니다).
Mark Amery

설명은 : 대체, 원래의 질문에 대답하기 t위해 typeof(Animal). 따라서 Mark의 개선 된 형태는 t.IsInstanceOfType(x).
ToolmakerSteve

13

GetType()기본 object유형 에 정의되어 있으므로 모든 단일 프레임 워크 유형에 존재 합니다. 따라서 유형 자체에 관계없이이를 사용하여 기본Type

따라서 다음과 같이하면됩니다.

u.GetType() == t

1
실제로 Eric의 대답은 도움이되지만 원래 질문에 설명 된 "u is t"방식으로 알 수없는 유형으로 테스트하는 방법에 대한 실제 질문에는 대답하지 않습니다.
Daniel

@ 다니엘-정확히는 아닙니다. Dave의 대답은 t의 하위 클래스 를 제외 하려는 경우에만 정확합니다 . Eric의 대답은 주로 무엇을해야하는지 설명합니다. "t"를 어디에 넣어야하는지에 대한 설명이 누락되었습니다. 거기에 댓글을 달겠습니다.
ToolmakerSteve

10

인스턴스의 유형이 클래스의 유형과 같은지 확인해야합니다. 인스턴스 유형을 가져 오려면 다음 GetType()메소드 를 사용하십시오 .

 u.GetType().Equals(t);

또는

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

해야합니다. 원하는 경우 비교를 위해 '=='를 사용할 수 있습니다.


+1 그러나 두 번째 선택을 선호합니다. u.GetType.Equals(typeof(User));
Omar

이것이 ==를 사용하는 것보다 덜 안전한 한 가지 이유는 GetType ()이 어떻게 든 null을 반환하면-던질 것입니다.
Dave Bish

1
@Fuex, 예, typeof가 인라인이면 코드를 더 쉽게 읽을 수 있다고 생각합니다. 그래서 OPs 예제에서 그는 이미 t유형을 포함 하는 변수 를 가지고 있음에도 불구하고 그렇게 게시했습니다 .
Sam Holder

@DaveBish GetType이 null을 반환하면 많은 일이 발생하기 시작 할까 봐 걱정할 것입니다 ...하지만 요점을 찍었습니다. 물론 맞습니다
Sam Holder

@SamHolder 예-이것이 발생하는 유일한 상황은 누군가 기본 유형을 무시하고 어떻게 든 구현을 망칠 경우입니다. 확실히 이상 할 것입니다.
Dave Bish

4

객체가 작성하는 대신 주어진 유형 변수와 호환되는지 확인하기 위해

u is t

너는 써야한다

typeof(t).IsInstanceOfType(u)

1
'u is t'구문에 비해 더 자세한 구문의 이점은 무엇입니까?
Kyle Humfeld

@KyleHumfeld 유형 foo가있는 경우; 개체 A; 당신은 "A는 foo는있다"쓸 수 없습니다,하지만 당신은 쓸 수 foo.isInstanceOfType (A)
티무르 Nuriyasov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.