Language/C#.NET | Posted by 아키텍처 2012. 4. 24. 16:12

Reflection

 
 

Reflection

리플렉션(Reflection)

   - 런타임 시에 객체에 대한 정보를 질의 하는 방법.

   - System.Reflection

   - System.Type 클래스를 이용.

 

객체의 Type가져오기

   - typeof 연산자

   - System.Object의 GetType()

   - Type.GetType()

 

using System; 
using System.Reflection;

public class GetTypeTest { 
    public static void Main() {

        //1. dll 파일로 접근하는 방법 
        Assembly a = Assembly.LoadFrom("C:\\WINNT\\Microsoft.NET\\Framework\\v1.0.3705\\System.dll"); 
        //LoadFrom() 메서드 : 로드하고자 하는 파일의 경로와 파일의 확장자까지 입력해야 사용

        //Assembly a = Assembly.Load("System"); 
        //Load() 메서드 : 경로를 지정불가, 실행파일이 있는 현재의 디렉터리를 기준으로 dll을 로딩후 파일의 확장자를 제외한 파일의 이름만을 사용.  결과로 출력된 822라는 것은 System.dll 파일 안에 존재하는 Type 클래스의 개수.

        Type [ ] type = a.GetTypes(); 
        Console.WriteLine(type.Length);         // 결과 :  822

        /*
        foreach(Type t in type){ 
            Console.WriteLine(t.FullName); 
        }
        */

 

        //2. 객체로 접근하는 방법 
        string s = "jabook"; 
        Type t1 = s.GetType(); 
        Console.WriteLine(t1);           //결과 : System.String

 

        //3. 런타임 시 지정된 이름으로 접근하는 방법 
        Type t2 = Type.GetType("System.String"); 
        Console.WriteLine(t2);    
   //결과 : System.String
         
        
//4. 클래스 타입으로 접근하는 방법 
        Type t3 = typeof(System.String); 
        Console.WriteLine(t3);      
 //결과 : System.String
        
    }
}

 

* Type을 이용하여 클래스의 정보 추출

    using System; 
    using System.Reflection;

    public class TypeInfoTest { 
        public int temp =1000; 
        public void PrintShow(){ } 
        public static void Main() { 
            try{


                Type t = Type.GetType("TypeInfoTest");

                Console.WriteLine("[기본클래스 타입]"); 
                Console.WriteLine(t.BaseType); 
              
  // BaseType 속성은 Type 클래스의 읽기전용 속성, 현재 Type 클래스가 직접 상속하는 클래스 타입(이름)을 반환. 
                // 만약, Object 클래스의 Type 클래스라면 상속하는 클래스가 없으므로 null을 반환.

 

                Console.WriteLine("[생성자 목록]"); 
                ConstructorInfo[ ] ctor = t.GetConstructors(); 
                for(int i=0;i<ctor.Length;i++) 
                Console.WriteLine(ctor[i]);

 

                Console.WriteLine("[메서드 목록]"); 
                MethodInfo[ ] m = t.GetMethods(); 
                for(int i=0;i<m.Length;i++) 
                Console.WriteLine(m[i]);

 

                Console.WriteLine("[변수 목록]"); 
                FieldInfo[ ] f = t.GetFields(); 
                for(int i=0;i<f.Length;i++) 
                    Console.WriteLine(f[i]); 
            }
            catch(Exception e)
            {
                Console.WriteLine(e.ToString());
            } 
        }
    }

 

필드 정보 탐색

   - GetField / GetFields

 

메소드 정보 탐색

   - GetMethods

 

생성자 탐색

   - GetConstructions

'Language > C#.NET' 카테고리의 다른 글

ASP.NET 서버 모델의 성능에 대한 고찰  (0) 2012.04.24
Machine Key  (0) 2012.04.24
Attribute  (0) 2012.04.24
C# 기초  (0) 2012.04.24
날짜차이계산  (0) 2012.04.24
Posted by 김준홍 (http://www.Juuun.com)