C#에서 리플렉션(Reflection)을 활용하면 특정 타입 내부에 선언된 중첩된 유형(Nested Types)을 손쉽게 조회할 수 있습니다. Type.GetNestedTypes() 메서드를 사용하면 해당 타입 안에 포함된 모든 중첩 클래스 정보를 배열 형태로 반환받을 수 있습니다.
GetNestedTypes() 메서드란?
GetNestedTypes()는 System 네임스페이스의 Type 클래스에서 제공하는 메서드로, 호출한 타입 내부에 중첩되어 있는 public 및 protected 중첩 타입들을 Type[] 배열로 반환합니다. 선택적으로 BindingFlags를 인자로 전달하여 검색 범위를 세밀하게 조정할 수도 있습니다.
예제 1: 기본 사용법
다음 예제는 Subject 클래스 내부에 정의된 중첩 타입들을 조회하는 코드입니다.
using System;
public class Demo {
public static void Main() {
Type type1 = typeof(Subject);
try {
Type[] type2 = type1.GetNestedTypes();
Console.WriteLine("Nested Types...");
for (int i = 0; i < type2.Length; i++)
Console.WriteLine("{0} ", type2[i]);
}
catch (ArgumentNullException e) {
Console.Write("{0}", e.GetType(), e.Message);
}
}
}
public class Subject {
public class BasicSubject {
//
}
public class AdvSubject {
//
}
}실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
Nested Types... Subject+BasicSubject Subject+AdvSubject
출력 결과에서 볼 수 있듯이, 중첩 타입은 외부클래스명+내부클래스명 형식으로 표시됩니다. Subject 클래스 안에 BasicSubject와 AdvSubject 두 개의 중첩 클래스가 선언되어 있으며, 이들이 모두 조회된 것을 알 수 있습니다.
예제 2: BindingFlags를 활용한 조회
두 번째 예제에서는 BindingFlags.Public 옵션을 지정하여 public으로 선언된 중첩 타입만 명시적으로 필터링하여 조회합니다.
using System;
using System.Reflection;
public class Demo {
public static void Main() {
Type type1 = typeof(Subject);
try {
Type[] type2 = type1.GetNestedTypes(BindingFlags.Public);
Console.WriteLine("Nested Types...");
for (int i = 0; i < type2.Length; i++)
Console.WriteLine("{0} ", type2[i]);
}
catch (ArgumentNullException e) {
Console.Write("{0}", e.GetType(), e.Message);
}
}
}
public class Subject {
public class BasicSubject {
//
}
public class AdvSubject {
//
}
}실행 결과
Nested Types... Subject+BasicSubject Subject+AdvSubject
정리
- GetNestedTypes(): 매개변수 없이 호출하면 public과 protected 중첩 타입을 모두 반환합니다.
- GetNestedTypes(BindingFlags): BindingFlags 옵션을 지정하면 원하는 접근 수준의 중첩 타입만 선택적으로 조회할 수 있습니다.
- 중첩 타입의 이름은 외부타입+내부타입 형태로 출력됩니다.
이처럼 C#의 리플렉션 API를 활용하면 런타임에 타입 구조를 동적으로 분석할 수 있어, 플러그인 시스템, 직렬화 도구, DI 컨테이너 등 다양한 고급 프로그래밍 시나리오에서 유용하게 활용됩니다.