2009년 10월 9일 금요일

Reflection

Reflection API를 사용해서, Assembly로부터 클래스를 로드하기(C#)

클래스를 참조하지 않은 상태에서, DLL로부터 동적으로 클래스를 로드해서 써야 경우가 있다. 그럴 때는 .NET에서 제공하는 Reflection API 사용해서 클래스를 로드하고 인스턴스화할 있다. 다음 코드와 같이 사용하면 된다.

 

System.Reflection.Assembly assm =

System.Reflection.Assembly.LoadFile(@"D:AssembliesSomeAssembly.dll");

object obj = assm.CreateInstance("FullClassName");

 

출처 : http://kkongchi.egloos.com/2133754

 

C#에서 클래스명으로만 생성

디자인 패턴 공부중 자바소스를 C#으로 바꾸면서 하다가 알게된 사실이다.

자바에는

Class클래스 라는것이 있는데

Class 클래스의 forName 메소드를 사용해서 그 클래스를 동적으로 읽을수 있다. 또한 newInstance 메소드를 이용해서 그 클래스의 인스턴스를 한개 작성할수 있다.

Abstract Factory 패턴의 소스중에 이부분이 포함되어 있어서 C#에서 이러한 기능을 할수 있는 방법은 무었일까하고 찾아보았더니 Reflection으로 가능하였다.

 

펼쳐두기..


1) Assembly 타입의 인스턴스를 얻어와야 합니다.

   C# 의 리플렉션 기술은 Assembly 타입의 인스턴스를 통해서 가능합니다.

 

2) Assembly 타입의 인스턴스를 이용하여, 원하는 클래스의 인스턴스를 생성하면 됩니다.

   이 때, CreateInstance() 메소드를 이용하면 되겠습니다.

   이 메소드에, 완전히 한정된 이름(Fully Qualified Name)을 지정해 줘야 합니다.

   단순히, TestClass 이것만 넣어주면 않 됩니다.


   네임스페이스 이름.클래스 이름


    이렇게 적어주면 되겠습니다.

 

    "ReflectionTEST.TestClass"


    예제에서 네임스페이스는 ReflectionTEST 이며,

     클래스는 TestClass 입니다.


3) 이제 TestClass 클래스의 인스턴스를 이용하여, 원하는 작업을 수행하면 됩니다.

 

 TestClass myClass = assembly.CreateInstance("ReflectionTEST.TestClass") as TestClass;

 

이 문장은


 TestClass myClass = new TestClass();


와 동일합니다.

 

출처 : http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10115&docid=9620077&qb=QyMgY2xhc3Mg7YG0656Y7IqkIGZvcm5hbWU=&enc=utf8&pid=fVJR0loi5ThssZCl77lsss--191561&sid=Ss7N5YqozkoAADgVbLg

 

댓글 없음:

댓글 쓰기