리플렉션(Reflection)이란 ?
MSDN에서는 아래와 같이 설명합니다.
리플렉션에서는 어셈블리, 모듈 및 형식을 설명하는 Type 형식의 개체를 제공합니다.
리플렉션을 사용하여 형식의 인스턴스를 동적으로 만들거나, 형식을 기존 개체에 바인딩하거나, 기존 개체에서 형식을 가져오고 해당 메서드를
호출하거나 해당 필드와 속성에 액세스할 수 있습니다. 코드에서 특성을 사용하는 경우 리플렉션을 통해 해당 특성에 액세스할 수 있습니다.
+원래 코드는 어셈블러에 의해서 기계어로 바뀌면서 해당 타입정보는 사라지는것인데 C#에서는 컴파일된 실행파일에 타입에대한
메타정보가 저장됩니다. 따라서 실행중에도 해당 타입에 대한 정보를 불러와서 사용이 가능합니다.
기본적으로는 해당 타입에 대해서 GetMethods() 함수를 이용해서 포함된 메서드들을 리스트로 가져 올 수있으며
GetFields()로 속한 멤버변수들을 가져올 수가 있다.
namespace TistoryWin { class HongsClass { public string Name { get; set; } public int intCount { get; set; } public void NameToString() { Console.WriteLine(Name); } public void CountTostring() { Console.WriteLine(intCount.ToString()); } } }각각 멤버 변수 2개와 메서드가 2개가 선언 되어 있을 때 아래처럼 불러오면 해당 메서드와 멤버변수들을 불러 올 수가 있다.
2.리플렉션을 이용해서 타입정보와 메서드 정보, 멤버변수 정보를 불러오기.
Type t = Type.GetType("TistoryWin.HongsClass"); foreach (MethodInfo item in t.GetMethods()) { Console.WriteLine(item.ToString()); } foreach (PropertyInfo item in t.GetProperties()) { Console.WriteLine(item.ToString()); }
단, 위의 GetMethods()는 2개 이상이 출력되는데 기본적으로 상속받은 메서드들도 다 출력이 됩니다.
3.리플렉션을 이용하면 아래와 같은상황에서 매우 편리하게 클래스를 초기화 할 수 있습니다.
만약, 인터넷에서 REST로 다운로드 되는 XML에서 하나의 정보를 구성하는 데이터가 수십개의 노드들로 구성이 되어있고
이에 해당하는 클래스를 멤버변수를 노드의 이름으로 설정을 해놓은 상황이있다고 했을때,
Node들의 이름에 따라서 멤버변수을 설정해야 할 때는 일일이 지정하기가 힘듭니다. 이때 리플렉션을 이용하면 한줄로
깔끔하게 처리가 됩니다.
foreach (XmlNode nowItem in DataItems) { tempStatus = new HongsClass(); foreach (XmlNode nowSubItem in nowItem) { tempStatus.GetType().GetProperty(nowSubItem.Name).SetValue(tempStatus, nowSubItem.InnerText, null); } ReturnData.Add(tempStatus); }
위에서 우선 GetProperty로 해당 노드의 이름에 대한 프로퍼니가 어떤것인지를 가져왔으며, 두번째로 SetValue()라는 함수를 이용해서
tempStatus의 인스턴스에 해당멤버변수에 값을 nowSubItem.InnerText로 설정하는 내용입니다.
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 제네릭 ( Generics ) (1) | 2015.03.26 |
---|---|
[C#] 해시테이블 vs 딕셔너리 ( hashtable vs. dictionary ) (10) | 2015.03.25 |
[C#] 사용자 정의 코드조각 추가하기 (Code Snippet) (1) | 2015.03.23 |
[C#] 이벤트 생성 및 사용자 정의 EventArg (3) | 2015.03.23 |
[C#] XML 다루기 - Property 와 Node 접근하기, 네임스페이가 있는 Node처리리 (0) | 2015.03.20 |