C#에서 지정된 타입 핸들이 참조하는 타입 가져오기
C#에서는 Type.GetTypeFromHandle() 메서드를 사용하면 지정된 타입 핸들(RuntimeTypeHandle)이 참조하는 실제 타입을 손쉽게 가져올 수 있습니다. 반대로 Type.GetTypeHandle() 메서드를 사용하면 특정 타입에 대한 런타임 타입 핸들을 얻을 수 있습니다.
핵심 메서드 정리
- Type.GetTypeHandle(object) – 지정된 객체의 타입에 대한 런타임 타입 핸들을 반환합니다.
- Type.GetTypeFromHandle(RuntimeTypeHandle) – 타입 핸들이 참조하는 타입을 반환합니다.
예제 1
다음 예제에서는 short 타입의 핸들을 구한 뒤, 그 핸들로부터 원래 타입을 다시 가져와서 타입의 특성(Attributes)을 출력합니다.
using System;
public class Demo {
public static void Main() {
Type type1 = typeof(short);
RuntimeTypeHandle typeHandle = Type.GetTypeHandle(type1);
Type type = Type.GetTypeFromHandle(typeHandle);
Console.WriteLine("Attributes = " + type.Attributes);
}
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Attributes = AutoLayout, AnsiClass, Class, Serializable, BeforeFieldInit
예제 2
이번에는 System.Type 타입 자체에 대해 동일한 작업을 수행해 보겠습니다.
using System;
public class Demo {
public static void Main() {
Type type1 = typeof(System.Type);
RuntimeTypeHandle typeHandle = Type.GetTypeHandle(type1);
Type type = Type.GetTypeFromHandle(typeHandle);
Console.WriteLine("Attributes = " + type.Attributes);
}
}출력 결과
Attributes = AutoLayout, AnsiClass, Class, Serializable, BeforeFieldInit
두 예제 모두 동일한 특성 값이 출력됩니다. 각 특성이 의미하는 바는 다음과 같습니다.
- AutoLayout – CLR(공용 언어 런타임)이 클래스의 필드 배치를 자동으로 결정합니다.
- AnsiClass – 문자열이 ANSI 형식으로 처리됨을 나타냅니다.
- Class – 해당 타입이 클래스 형식임을 나타냅니다.
- Serializable – 직렬화가 가능한 타입입니다.
- BeforeFieldInit – 정적 필드 초기화가 첫 번째 정적 필드 접근 이전에 수행될 수 있음을 나타냅니다.
이처럼 GetTypeHandle()과 GetTypeFromHandle()은 서로 반대되는 역할을 하는 메서드로, 타입 정보를 핸들 형태로 변환하거나 핸들로부터 원래 타입을 복원할 때 유용하게 활용할 수 있습니다.