C#에서 특정 타입이 가진 필드 정보를 조회하려면 System.Reflection 네임스페이스의 FieldInfo 클래스와 Type.GetField() 메서드를 활용하면 됩니다. 이 메서드에 필드 이름을 문자열로 전달하면 해당 필드의 정보가 담긴 FieldInfo 객체가 반환됩니다.
예제 1: 존재하는 필드 조회하기
다음은 Subject 클래스의 SubName 필드를 조회하는 기본적인 예제입니다.
using System;
using System.Reflection;
public class Demo {
public static void Main() {
Type type = typeof(Subject);
try {
FieldInfo fieldInfo = type.GetField("SubName");
Console.WriteLine("FieldInfo = {0}", fieldInfo);
}
catch (ArgumentNullException e) {
Console.Write("{0}", e.GetType(), e.Message);
}
}
}
public class Subject {
public string SubName = "Science";
}실행 결과
FieldInfo = System.String SubName
위 예제에서는 typeof(Subject)로 타입 객체를 얻은 뒤, GetField("SubName")을 호출하여 필드 정보를 가져왔습니다. 출력 결과에서 확인할 수 있듯이 반환된 FieldInfo 객체에는 필드의 데이터 타입(System.String)과 이름(SubName)이 함께 표시됩니다.
예제 2: null 값을 전달한 경우
그렇다면 GetField() 메서드에 null을 전달하면 어떻게 될까요? 다음 예제를 통해 살펴보겠습니다.
using System;
using System.Reflection;
public class Demo {
public static void Main() {
Type type = typeof(Subject);
try {
FieldInfo fieldInfo = type.GetField(null);
Console.WriteLine("FieldInfo = {0}", fieldInfo);
}
catch (ArgumentNullException e) {
Console.Write("{0}", e.GetType(), e.Message);
}
}
}
public class Subject {
public string SubName = "Science";
}실행 결과
System.ArgumentNullException
필드 이름 자리에 null을 전달하면 ArgumentNullException 예외가 발생합니다. 따라서 실무 코드에서는 try-catch 블록으로 이런 상황을 처리하거나, 메서드를 호출하기 전에 인자 값이 유효한지 먼저 검사하는 습관을 들이는 것이 안전합니다.
정리
Type.GetField(string name)은 지정한 이름의 public 필드 정보를 FieldInfo 객체로 반환합니다.- 해당 이름의 필드가 존재하지 않으면 null을 반환하며, 인자로 null을 전달하면 ArgumentNullException이 발생합니다.
- private 필드까지 조회하려면
BindingFlags.NonPublic | BindingFlags.Instance같은 바인딩 플래그를 함께 사용해야 합니다.