인스턴스가 유형인지 확인


181

이것을 사용하여 c의 인스턴스 인지 확인하십시오 TForm.

c.GetType().Name.CompareTo("TForm") == 0

string에 매개 변수로 사용하는 것 외에도 더 안전한 유형의 안전한 방법 이 CompareTo()있습니까?


20
나는 당신이 자바에서도 그렇게하지 않기를 바랍니다. Java instanceof와 C # is은 훨씬 더 나은 방법입니다.
Powerlord

답변:


410

여기에 다른 대답은 두 가지 의미가 있습니다.

인스턴스인지 여부는 확인하려면 정확한 입력 한 후

if (c.GetType() == typeof(TForm))

갈 길입니다.

서브 클래스c 의 인스턴스 인지 TForm 서브 클래스 인지 알고 싶다면 is/ 를 사용하십시오 as.

if (c is TForm)

또는

TForm form = c as TForm;
if (form != null)

이러한 행동 중 실제로 원하는 행동이 무엇인지 마음에 새기십시오.


7
작은 메모 : 캐스트 결과를 사용하지 않으려면 "is"를 사용하고, "as"를 사용하십시오.
Aviram Fireberger

14
C # 7을 사용하면 결합 할 수 있습니다 isas패턴 매칭으로 :if (x is TForm tf) {…
리처드

39
if(c is TFrom)
{
   // Do Stuff
}

당신이 사용하려는 경우 또는 cA와 TForm다음 예를 사용합니다 :

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}

두 번째 예 c는 유형이 TForm한 번 인지 확인하기 만하면됩니다 . 있는지이 경우 Whereis 당신이 선택하면 c유형 인 TForm다음 캐스트의 CLR은 별도의 검사를 받는다. 여기 참조 입니다.

편집 : Jon Skeet의 도난

에서 상속하는 클래스 c가 아닌지 확인 하려면 다음을 사용하십시오.TFormTForm

if(c.GetType() == typeof(TForm))
{
   // Do stuff cause c is of type TForm and nothing else
}


10

또한 같은 맥락에서

Type.IsAssignableFrom(Type c)

"c와 현재 유형이 동일한 유형을 나타내거나 현재 유형이 c의 상속 계층 구조에 있거나 현재 유형이 c가 구현하는 인터페이스이거나 c가 일반 유형 매개 변수이고 현재 유형 인 경우 참 "c의 제약 조건 중 하나를 나타냅니다."

여기에서 : http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx


이것은 또한 내가 개인적으로 좋아하는 것입니다. typeof(Class).IsAssignableFrom(object.getType())Java instanceof연산자 와 유사합니다 .
SkidRunner

상속 계층 구조의 동일한 브랜치에 없지만 변환 연산자가있는 경우 거짓을 제공합니까?
Paul Stelian

좋은 질문 @PaulStelian. 나는 머리 꼭대기에서 확실하지 않지만 그 상황에서 거짓을 반환 할 것이라고 추측합니다. 그것은 적어도 내 예상 행동 일 것입니다. 암시 적 변환이 존재하면 true를 반환하지만 홀수 일 수 있습니다.
브래드 커닝햄

그것을 시도하기 위해 Visual Studio를 설치 한 사람이 있습니까?
Paul Stelian

1
@PaulStelian-false를 반환합니다. 이것은 doc 링크를 따르고 변환에 대한 언급이 없음을 관찰하면 알 수 있습니다. 그것에 대해 생각하는 또 다른 방법은 즉 T1.IsAssignableFrom(T2)반환 true상황에서 어디 as운영자 반환 null이 아닌 값, 그 형식의 인스턴스 주어진다.
ToolmakerSteve

9

c를 TForm으로 사용하려는 경우 다른 답변보다 약간 컴팩트합니다.

if(c is TForm form){
    form.DoStuff();
}


2

다른 사람들이 언급했듯이 "is"키워드. 그러나 나중에 해당 유형으로 캐스트하려는 경우입니다.

TForm t = (TForm)c;

그런 다음 "as"키워드를 사용해야합니다.

예 : TForm t = c as TForm.

그럼 당신은 확인할 수 있습니다

if(t != null)
{
 // put TForm specific stuff here
}

중복 검사이므로 그대로 사용하지 마십시오.



-1
bool isValid = c.GetType() == typeof(TForm) ? true : false;

또는 더 간단한

bool isValid = c.GetType() == typeof(TForm);

IMHO : 직접적인 동정심을 피하려고합니다 (예 :) ==. 특정 유형이 예를 들어 sealed클래스 에서 상속되지 않는다는 것을 알지 않는 한 상속을 지원하는 객체 또는 지향 언어 . 또한 : (정적 / 상수) 부울 값을 반환하는 삼항 연산자를 사용하면 성가 시게됩니다 switch.
SkidRunner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.