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

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

System.RuntimeType:[First.Namespace.FirstClass]

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

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

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



답변

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().


답변

에 대한 대답에서 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을 확인할 수도 있습니다.


답변

간단히 말해서 …

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

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

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


답변

이 블로그를 살펴보면 그 사람이 차이점에 대해 이야기합니다. 이 클래스는 .NET 최적화의 결과라고 생각합니다.

http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx


답변