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), 상속 여부 등을 세밀하게 제어할 수 있습니다. 리플렉션 기반 기능을 개발할 때 이 두 가지 오버로드의 차이를 정확히 이해해 두면 큰 도움이 됩니다.