Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 현재 타입(Type)의 필드를 가져오는 방법

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 네임스페이스의 FieldInfoBindingFlags를 사용하면 타입 내부에 숨겨진 필드까지 손쉽게 확인할 수 있습니다. 참고로 BindingFlags.Public을 함께 지정하면 공개 필드도 함께 조회할 수 있으며, 인스턴스 멤버를 찾으려면 BindingFlags.Instance 플래그를 추가하면 됩니다. 다만 비공개 멤버에 접근하는 것은 캡슐화를 우회하는 행위이므로, 디버깅이나 학습 목적으로 신중하게 사용하는 것이 좋습니다.