리플렉션(Reflection)은 코드에 정의된 타입(Type), 메서드(Method), 필드(Field) 등의 메타데이터(metadata)를 런타임에 조사하고 조작할 수 있게 해주는 기능입니다.
C#에서는 System.Reflection 네임스페이스를 통해 로드된 어셈블리(Assembly)와 그 내부 요소인 클래스, 메서드, 값 타입 등에 대한 정보를 얻을 수 있습니다. 이 네임스페이스에는 다양한 클래스가 존재하지만, 실무에서 가장 많이 사용되는 클래스는 다음과 같습니다.
- Assembly – 어셈블리 자체의 정보 및 로드
- AssemblyName – 어셈블리의 이름, 버전, 문화권 등 식별 정보
- ConstructorInfo – 생성자 정보
- MethodInfo – 메서드 정보
- ParameterInfo – 매개변수 정보
- EventInfo – 이벤트 정보
- PropertyInfo – 속성(Property) 정보
- MemberInfo – 멤버 전반의 공통 정보
예제 코드
아래 예제는 TextInfo 타입의 모든 선언된 속성과 메서드를 리플렉션으로 가져와 화면에 출력하는 코드입니다.
static void Main(string[] args){
TypeInfo myType = typeof(TextInfo).GetTypeInfo();
IEnumerable<PropertyInfo> properties = myType.DeclaredProperties;
IEnumerable<MethodInfo> methods = myType.DeclaredMethods;
Console.WriteLine(myType);
Console.WriteLine(properties);
Console.WriteLine(methods);
StringBuilder strBuilder = new StringBuilder();
Console.WriteLine();
strBuilder.Append("The properties are:");
foreach (PropertyInfo p in properties){
strBuilder.Append("\n" + p.Name);
}
strBuilder.Append("\n");
strBuilder.Append("\nThe methods are:");
foreach (MethodInfo m in methods){
strBuilder.Append("\n" + m.Name);
}
Console.WriteLine(strBuilder);
}
코드 설명
typeof(TextInfo).GetTypeInfo():TextInfo타입의TypeInfo객체를 가져옵니다.DeclaredProperties: 해당 타입에 직접 선언된 모든 속성 목록을 반환합니다.DeclaredMethods: 해당 타입에 직접 선언된 모든 메서드 목록을 반환합니다.StringBuilder를 사용해 각 멤버의 이름(Name)을 줄바꿈하며 누적한 뒤 한 번에 출력합니다.
실행 결과
System.Globalization.TextInfo System.Reflection.PropertyInfo[] System.Reflection.MethodInfo[] The properties are: Invariant ANSICodePage OEMCodePage MacCodePage EBCDICCodePage LCID CultureName IsReadOnly ListSeparator IsAsciiCasingSameAsInvariant IsRightToLeft The methods are: get_Invariant get_ANSICodePage get_OEMCodePage get_MacCodePage get_EBCDICCodePage get_LCID get_CultureName get_IsReadOnly get_ListSeparator set_ListSeparator get_IsAsciiCasingSameAsInvariant get_IsRightToLeft System.Runtime.Serialization.IDeserializationCallback.OnDeserialization Clone ReadOnly VerifyWritable SetReadOnlyState ToLower ToLower ChangeCase ChangeCaseToLower ChangeCaseToUpper ChangeCaseCommon ChangeCaseCommon ChangeCaseCommon ToLowerAsciiInvariant ToLowerAsciiInvariant ToUpperAsciiInvariant ToUpperAsciiInvariant ToLowerAsciiInvariant ToUpper ToUpper ToUpperAsciiInvariant IsAscii PopulateIsAsciiCasingSameAsInvariant Equals GetHashCode ToString ToTitleCase AddNonLetter AddTitlecaseLetter IsWordSeparator IsLetterCategory FinishInitialization ChangeCase IsInvariantLocale
출력 결과를 보면 자동 구현 속성에 대응하는 get_*, set_* 접근자 메서드까지 함께 조회되는 것을 확인할 수 있습니다. 이처럼 리플렉션을 활용하면 컴파일 시점에 알지 못했던 타입의 구조를 런타임에 동적으로 탐색할 수 있어, 플러그인 시스템, 직렬화/역직렬화, DI 컨테이너, 단위 테스트 프레임워크 등 다양한 분야에서 폭넓게 활용됩니다.