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

C# Type.GetMembers() 메서드 완벽 정리 – 리플렉션으로 멤버 정보 조회하기

C#의 Type.GetMembers() 메서드는 리플렉션(Reflection)을 활용해 현재 타입(Type)이 가진 모든 멤버, 즉 프로퍼티, 메서드, 필드, 이벤트 등을 한 번에 조회할 수 있도록 해주는 강력한 API입니다.


이 메서드를 사용하면 컴파일 시점이 아닌 런타임에 타입의 구조를 동적으로 분석할 수 있어, 플러그인 시스템, 직렬화 도구, ORM 프레임워크 등을 개발할 때 유용하게 활용됩니다.


기본 구문

Type.GetMembers() 메서드는 두 가지 오버로드 형태로 제공됩니다.

public System.Reflection.MemberInfo[] GetMembers ();
public abstract System.Reflection.MemberInfo[] GetMembers (System.Reflection.BindingFlags bindingAttr);

  • 매개변수 없는 버전: 해당 타입의 모든 public 멤버를 반환합니다.
  • BindingFlags 매개변수 버전: 검색 조건(공개 여부, 인스턴스/정적 여부 등)을 지정하여 원하는 멤버만 필터링해 가져올 수 있습니다.

예제 1 – 기본 사용법

다음은 Type.GetMembers() 메서드를 사용하여 타입의 멤버 목록을 출력하는 기본적인 예제입니다.

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.GetMembers();
            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 ToString() Boolean Equals(System.Object)
Int32 GetHashCode()
System.Type GetType()
Void .ctor()
System.String SubName
FieldInfo = System.String SubName

출력 결과를 보면 Subject 클래스 자체의 필드인 SubName뿐만 아니라, 모든 클래스가 기본적으로 상속받는 ToString(), Equals(), GetHashCode(), GetType() 같은 Object 클래스의 멤버들까지 함께 조회된 것을 알 수 있습니다.


예제 2 – BindingFlags로 검색 범위 제어하기

이번에는 BindingFlags를 사용하여 검색 대상을 public 인스턴스 멤버로 한정하는 예제를 살펴보겠습니다.

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.GetMembers(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";
}

실행 결과

BindingFlags 조건을 적용하면 상속된 멤버가 제외되고, 지정한 조건에 맞는 멤버만 반환됩니다.

Members = System.String ToString() Boolean Equals(System.Object)
Int32 GetHashCode()
System.Type GetType()
Void .ctor()

정리

Type.GetMembers() 메서드는 런타임에 타입의 멤버 정보를 동적으로 탐색할 때 필수적인 리플렉션 API입니다. 매개변수 없이 호출하면 public 멤버 전체를 가져오고, BindingFlags를 조합하면 접근 수준(public/private), 멤버 종류(instance/static), 상속 여부 등을 세밀하게 제어할 수 있습니다. 리플렉션 기반 기능을 개발할 때 이 두 가지 오버로드의 차이를 정확히 이해해 두면 큰 도움이 됩니다.