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를 사용하면 런타임에 타입의 구조를 동적으로 탐색하고, 필요한 멤버 정보를 유연하게 가져올 수 있습니다.