Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 리플렉션(Reflection)으로 메서드와 속성 조회하는 방법

리플렉션(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 컨테이너, 단위 테스트 프레임워크 등 다양한 분야에서 폭넓게 활용됩니다.