C#에서는 리플렉션(Reflection)을 활용하면 특정 타입이 가지고 있는 필드 정보를 런타임에 동적으로 조회할 수 있습니다. Type 클래스의 GetFields() 메서드와 BindingFlags 열거형을 조합하면 public 멤버뿐만 아니라 non-public(비공개) 정적 필드까지 가져올 수 있습니다.
예제 1: System.String 타입의 비공개 필드 조회
using System;
using System.Reflection;
public class Demo {
public static void Main() {
Type type = typeof(System.String);
FieldInfo[] fields = type.GetFields(BindingFlags.Static | BindingFlags.NonPublic);
Console.WriteLine("Following are the non-public fields=");
foreach (FieldInfo myField in fields) {
Console.WriteLine(myField.ToString());
}
}
}
출력 결과
Following are the non-public fields= Int32 TrimHead Int32 TrimTail Int32 TrimBoth Int32 charPtrAlignConst Int32 alignConst
코드 설명
typeof(System.String)으로 String 타입 정보를 가져온 뒤, GetFields() 메서드에 BindingFlags.Static(정적 멤버 검색)과 BindingFlags.NonPublic(비공개 멤버 검색) 플래그를 OR(|) 연산으로 전달합니다. 그러면 해당 타입의 모든 비공개 정적 필드가 FieldInfo 배열로 반환되고, foreach 문을 통해 각 필드의 자료형과 이름을 출력할 수 있습니다.
예제 2: System.Char 타입의 비공개 필드 조회
같은 방식으로 System.Char 타입에 적용해 보겠습니다.
using System;
using System.Reflection;
public class Demo {
public static void Main() {
Type type = typeof(System.Char);
FieldInfo[] fields = type.GetFields(BindingFlags.Static | BindingFlags.NonPublic);
Console.WriteLine("\nFollowing are the non-public fields=");
foreach (FieldInfo myField in fields) {
Console.WriteLine(myField.ToString());
}
}
}
출력 결과
Following are the non-public fields= Byte[] categoryForLatin1 Int32 UNICODE_PLANE00_END Int32 UNICODE_PLANE01_START Int32 UNICODE_PLANE16_END Int32 HIGH_SURROGATE_START Int32 LOW_SURROGATE_END
마무리
이처럼 System.Reflection 네임스페이스의 FieldInfo와 BindingFlags를 사용하면 타입 내부에 숨겨진 필드까지 손쉽게 확인할 수 있습니다. 참고로 BindingFlags.Public을 함께 지정하면 공개 필드도 함께 조회할 수 있으며, 인스턴스 멤버를 찾으려면 BindingFlags.Instance 플래그를 추가하면 됩니다. 다만 비공개 멤버에 접근하는 것은 캡슐화를 우회하는 행위이므로, 디버깅이나 학습 목적으로 신중하게 사용하는 것이 좋습니다.