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

C#에서 현재 Type의 지정된 멤버를 가져오는 방법

C#에서는 리플렉션(Reflection)을 활용하면 현재 Type이 가진 특정 멤버를 손쉽게 조회할 수 있습니다. 이때 주로 사용되는 메서드가 바로 GetMember()GetField()입니다. 아래 예제를 통해 실제 사용법과 실행 결과를 확인해 보겠습니다.

예제 1

using System;
using System.Reflection;
public class Demo {
    public static void Main() {
        Type type = typeof(Subject);
        try {
            FieldInfo fieldInfo = type.GetField("SubName");
            MemberInfo[] info = type.GetMember("SubName");
            Console.Write("Members = ");
            for (int i = 0; i < info.Length; i++)
                Console.WriteLine(" {0}", info[i]);
            Console.WriteLine("FieldInfo = {0}", fieldInfo);
        }
        catch (ArgumentNullException e) {
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}
public class Subject {
    public string SubName = "Science";
}

출력

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Members =  System.String SubName
FieldInfo = System.String SubName

첫 번째 예제에서는 GetMember("SubName") 메서드에 멤버 이름만 전달하여 해당 멤버 정보를 가져왔습니다. 반환되는 값은 MemberInfo 배열 형태이며, 여기에는 필드뿐만 아니라 해당 이름을 가진 모든 종류의 멤버가 포함될 수 있습니다.

예제 2 – BindingFlags 옵션 활용

이번에는 검색 조건을 더 구체적으로 지정하기 위해 BindingFlags를 함께 사용해 보겠습니다.

using System;
using System.Reflection;
public class Demo {
    public static void Main() {
        Type type = typeof(Subject);
        try {
            FieldInfo fieldInfo = type.GetField("SubName");
            MemberInfo[] info = type.GetMember("SubName", BindingFlags.Public | BindingFlags.Instance);
            Console.Write("Members = ");
            for (int i = 0; i < info.Length; i++)
                Console.WriteLine(" {0}", info[i]);
            Console.WriteLine("FieldInfo = {0}", fieldInfo);
        }
        catch (ArgumentNullException e) {
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}
public class Subject {
    public string SubName = "Science";
}

출력

위 코드의 실행 결과는 다음과 같습니다.

Members = System.String SubName
FieldInfo = System.String SubName

주요 포인트 정리

  • GetMember(string): 지정한 이름과 일치하는 모든 public 멤버를 MemberInfo[] 배열로 반환합니다.
  • GetMember(string, BindingFlags): BindingFlags.Public, BindingFlags.Instance 등의 플래그를 조합하여 검색 범위를 세밀하게 제어할 수 있습니다.
  • GetField(string): 지정한 이름의 필드 하나를 FieldInfo 객체로 반환합니다.
  • 멤버 이름으로 null을 전달하면 ArgumentNullException이 발생하므로, 예외 처리 코드를 함께 작성하는 것이 안전합니다.

이처럼 C#의 리플렉션 API를 사용하면 런타임에 타입의 구조를 동적으로 탐색하고, 필요한 멤버 정보를 유연하게 가져올 수 있습니다.