System.Reflection 네임스페이스란?
System.Reflection 네임스페이스는 실행 중인 애플리케이션에 대한 정보를 조회하고, 타입(Type), 값(Value), 객체(Object)를 동적으로 추가하거나 조작할 수 있는 다양한 클래스를 제공합니다. 이를 통해 개발자는 컴파일 시점이 아닌 런타임에 어셈블리, 모듈, 타입 등의 메타데이터에 접근할 수 있습니다.
Module 클래스의 역할
Module 클래스는 새로운 인스턴스를 초기화하는 생성자를 가지고 있습니다. 여기서 모듈(Module)이란 하나 이상의 클래스와 인터페이스를 포함하는 실행 가능한 PE(Portable Executable) 파일을 의미합니다. 즉, .NET 어셈블리를 구성하는 기본 단위라고 할 수 있습니다.
리플렉션(Reflection)을 활용하면 사용자 정의 특성(Custom Attribute) 정보를 런타임에 읽어올 수도 있습니다. 아래 예제는 C#에서 System.Reflection을 사용하는 방법을 보여줍니다.
C# System.Reflection 예제 코드
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute {
public readonly string Url;
public string Topic // Topic은 명명된 매개변수(named parameter) {
get {
return topic;
}
set {
topic = value;
}
}
public HelpAttribute(string url) // url은 위치 매개변수(positional parameter) {
this.Url = url;
}
private string topic;
}
[HelpAttribute("Information on the class MyClass")]
class MyClass {
}
namespace AttributeAppl {
class Program {
static void Main(string[] args) {
System.Reflection.MemberInfo info = typeof(MyClass);
object[] attributes = info.GetCustomAttributes(true);
for (int i = 0; i < attributes.Length; i++) {
System.Console.WriteLine(attributes[i]);
}
Console.ReadKey();
}
}
}코드 설명
위 예제에서는 HelpAttribute라는 사용자 정의 특성을 정의한 뒤, MyClass에 적용했습니다. Main 메서드에서는 typeof(MyClass)로 해당 클래스의 MemberInfo 객체를 가져오고, GetCustomAttributes(true) 메서드를 호출하여 클래스에 적용된 모든 특성 정보를 배열로 반환받습니다. 마지막으로 반복문을 통해 각 특성을 콘솔에 출력합니다.
이처럼 리플렉션을 활용하면 코드에 부여된 메타데이터를 런타임에 동적으로 확인할 수 있어, 플러그인 구조나 설정 기반 애플리케이션 개발에 유용하게 활용됩니다.