C #에서 System.Type과 System.RuntimeType의 차이점은 무엇입니까?


89

나는 오늘 몇 가지 컨벤션 테스트를 시도하고 있었고 (를 호출하여) 어셈블리의 모든 유형을 가져 Assembly.GetTypes()오려고했습니다.

System.RuntimeType:[First.Namespace.FirstClass]

이 유형을와 비교할 때마다 typeof(FirstClass)같지 않습니다. 따라서 FirstClass제네릭 매개 변수로 포함 된 모든 유형을 찾으려고 할 때 아무것도 찾지 못했습니다.

System.RuntimeType과 의 차이점은 무엇입니까 System.Type?

내 문제를 해결할 방법이 있습니까?


6
현재 겪고있는 문제를 보여주는 작은 프로그램을 제공 할 수 있습니까?
Eric Lippert 2011

나는하려고했지만 이미 답을 얻었습니다 : P
Edgar Gonzalez

답변:


108

System.RuntimeType추상 기본 클래스에서 파생되는 구체적인 클래스입니다 System.Type. System.RuntimeType공개되지 않기 때문에 일반적으로 System.Type.

개체의 유형을 가져 오려고 할 때 GetType()해당 개체를 직접 사용하는 대신 첫 번째 개체의 유형을 나타내는 다른 개체를 실수로 호출 할 때 혼란이 발생할 수 있습니다 . 그런 다음 호출 된 객체가 유형을 나타낼 때 Type.ToString()반환 "System.RuntimeType"됩니다.

string str = string.Empty;
Type strType = str.GetType();
Type strTypeType = strType.GetType();
strType.ToString();     // returns "System.string"
strTypeType.ToString(); // returns "System.RuntimeType"

예를 들어, 이 블로그 게시물에서 누군가는 다음과 같이 데이터베이스의 열 유형을 가져 오려고합니다.

object val = reader.GetFieldType(index);
Type runtimeType = val.GetType();
PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType");
Type type = (Type)propInfo.GetValue(val, null);

val은 이미 Type 객체이므로 val.GetType ()은 System.RuntimeTime원래 유형 객체를 나타내는 데 사용되는 구체적인 유형이므로 유형 을 나타내는 다른 Type 객체를 반환 합니다. 그런 다음 블로그 게시물은 필요한 모든 것이 실제로 필요한 경우 원래 유형 객체의 유형을 얻기 위해 불필요한 반사 속임수를 보여줍니다.

Type type = reader.GetFieldType(index) as Type;

따라서 Type객체가를 나타낸다고보고하는 경우 이미 가지고있는 유형을 System.RuntimeType실수로 호출하지 않았는지 확인하십시오 GetType().


첫 번째 코드 스 니펫은 객체가의 인스턴스 Type인지 확인합니다 typeof(int). 를 전달하더라도 true를 반환합니다 . 두 번째 코드 스 니펫은 typeof(string).GetType()typeof(Type).
Mark Cidade

이것이 바로 제가 찾던 것입니다! 나는 Thomas Danecker의 게시물을 찾았지만 Doogal Bell의 게시물은 찾지 못했습니다
Edgar Gonzalez

1
@Mark Cidade. 고마워요. 더 도움이 될 수 있도록 답변을 수정하고 해당 블로그 게시물을 인용하여 혼동을 해결하기를 바랍니다.
Ergwun 2011-04-21

@Edgar Gonzalez : 제가 언급 한 블로그 게시물은 실제로 오해의 소지가 있습니다. 더 나은 정보는 업데이트 된 답변을 참조하십시오.
Ergwun 2011-04-21

4

에 대한 대답에서 System.Type과 System.RuntimeType 사이에 다른 에 의해 토마스 Danecker :

System.Type은 추상 기본 클래스입니다. CLR에는 내부 형식 System.RuntimeType에 구체적인 구현이 있습니다. 이 때문에 typeof (string) .GetType ()은 RuntimeType을 반환하지만 typeof (Type)은 일반 Type을 반환합니다. .Equals 메서드를 사용하면 실제로 false를 반환하는 object.ReferenceEquals를 수행합니다. 예상 결과를 얻으려면 type.IsInstanceOfType (element)를 사용할 수 있습니다. 요소가 파생 된 유형 인 경우에도 true를 반환합니다. 정확한 유형을 확인하려면 메서드의 반환 값이 false이면 원하는 결과가됩니다. 또한 checkType (arrayType, Type.GetType ( "System.RuntimeType"))을 사용하여 RuntimeType을 확인할 수도 있습니다.


1
"실제로합니다"-문법 교정을받을 수 있습니까? 이것은 모든 것의 핵심과 같고 말이되지 않습니다.
N73k

2

간단히 말해서 ...

    "".GetType().ToString()           == "System.String"

    "".GetType().GetType().ToString() == "System.RuntimeType"

내가 지금 생각하는 방식 System.Type은 런타임에 객체 유형 요청 결과를 나타내는 유형, 즉 System.RuntimeType. 따라서에서와 같이 객체의 유형을 요청할 때 반환 "".GetType()되는 인스턴스는 System.Type하위 항목 System.RuntimeType입니다. 사실,이 역시 있어야한다고 예상 typeof(System.Type).GetType()해야 System.RuntimeType하지만, 프레임 워크가 특별히 이것을 방지한다고 생각합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.