[C#] 리플렉션 ( Reflection )

|

리플렉션(Reflection)이란 ?


MSDN에서는  아래와 같이 설명합니다.


리플렉션에서는 어셈블리, 모듈 및 형식을 설명하는 Type 형식의 개체를 제공합니다.

리플렉션을 사용하여 형식의 인스턴스를 동적으로 만들거나, 형식을 기존 개체에 바인딩하거나, 기존 개체에서 형식을 가져오고 해당 메서드를

호출하거나 해당 필드와 속성에 액세스할 수 있습니다. 코드에서 특성을 사용하는 경우 리플렉션을 통해 해당 특성에 액세스할 수 있습니다. 


+원래 코드는 어셈블러에 의해서 기계어로 바뀌면서 해당 타입정보는 사라지는것인데 C#에서는 컴파일된 실행파일에 타입에대한

 메타정보가 저장됩니다.  따라서 실행중에도 해당 타입에 대한 정보를 불러와서 사용이 가능합니다.


기본적으로는 해당 타입에 대해서 GetMethods() 함수를 이용해서 포함된 메서드들을 리스트로 가져 올 수있으며 

GetFields()로 속한 멤버변수들을 가져올 수가 있다.



1.클래스 정보
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로 설정하는 내용입니다.





And