C#의 Type.GetMember() 메서드는 현재 Type에서 지정한 이름과 일치하는 멤버(필드, 메서드, 속성, 이벤트 등)를 조회할 때 사용됩니다. 리플렉션(Reflection)을 활용하면 런타임에 타입의 멤버 정보를 동적으로 가져올 수 있어, 플러그인 구조나 범용 데이터 바인딩 같은 시나리오에서 유용하게 활용됩니다.
문법(Syntax)
GetMember() 메서드는 다음과 같은 두 가지 오버로드를 제공합니다.
public System.Reflection.MemberInfo[] GetMember (string name); public virtual System.Reflection.MemberInfo[] GetMember (string name, System.Reflection.BindingFlags bindingAttr);
- name: 검색할 멤버의 이름입니다. null을 전달하면 ArgumentNullException이 발생합니다.
- bindingAttr: 검색 조건을 지정하는 BindingFlags 값입니다. 예를 들어 Public, Instance, Static 등을 조합해 검색 범위를 좁힐 수 있습니다.
반환값은 조건에 일치하는 멤버들을 담은 MemberInfo[] 배열입니다. 일치하는 멤버가 없으면 빈 배열이 반환됩니다.
예제 1: 기본 사용법
다음은 Type.GetMember() 메서드를 구현한 첫 번째 예제입니다.
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()와 GetField() 모두 "SubName"이라는 public 필드 정보를 정상적으로 반환했습니다.
예제 2: BindingFlags 옵션 활용
이번에는 Type.GetMember(String, 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";
}실행 결과
BindingFlags로 Public 인스턴스 멤버만 검색하도록 지정했기 때문에 결과는 동일합니다.
Members = System.String SubName FieldInfo = System.String SubName
정리
- Type.GetMember(string): 이름으로 멤버를 검색하며, 기본적으로 public 인스턴스 및 정적 멤버를 대상으로 합니다.
- Type.GetMember(string, BindingFlags): BindingFlags를 조합해 검색 범위를 세밀하게 제어할 수 있습니다.
- 멤버 이름이 null이면 ArgumentNullException이 발생하므로, 필요하다면 try-catch로 처리하는 것이 좋습니다.
- GetMember()는 필드뿐 아니라 메서드, 속성, 이벤트까지 포괄적으로 검색한다는 점에서 GetField(), GetMethod()보다 검색 범위가 넓습니다.