간단히 말하면 런타임으로 동적으로 다양한 작업을 하고자 할 때 사용합니다.
1) 다음과 같이 메타 정보를 런타임에 얻고자 할 경우
메타 정보란 응용프로그램의 기능와 상관없는 정보 => 실제 작업코드가 아닌 정보들... => 그 파일에 따라다니는 파일과 관련된 정보들
private string FileVersion() { Assembly asm=Assembly.LoadFrom(@"C:\abc.exe"); AssemblyName name=asm.GetName();
return name.Version.ToString(); }
라이브러리를 개발하면서 유지보수 내용을 기록하고 이런 메타 정보를 얻어서 유지보수등에 도움을 받기도 하고...
2) 어셈블리의 내용을 알고자 할 때 이벤트, 필드, 메소드 등등
Assembly asm = Assembly.Load("Mscorlib.dll"); Type[] types = asm.GetTypes(); foreach(Type t in types) { Console.WriteLine("Type : {0}", t) }
3) 개체의 이름으로 개체의 인스턴스 만들기 => 융통성 있는 코드를 작성할 수 있습니다.
예를 들어 다음과 같이 하면 오직 Form1만 열게 되고 private void OpenForm1() { Form frm = new Form1(); frm.Show(); }
다음과 같이 switch 구문을 사용해도 폼이 추가되면 또 코드를 수정해야 되고 private void OpenForm(string formName) { Form frm = null;
switch(formName) { case "Form1": frm = new Form1; break; case "Form2": frm = new Form2; break; .... } frm.Show(); }
그러나 리플렉션을 이용하면...
private button1_Click(.....) { OpenFormByName(this.textBox1.Text); }
private void OpenFormByName(string formName) { Assembly am = Assembly.GetEntryAssembly(); string fullName = asm.ToString() + "." + formName;
// 리플렉션: 이름(문자정보)으로 해당 타입을 알아내는 것 // => 이름을 주고 '요놈이 누구인가 찾아주세요' 하면 심사숙고해서 (리플렉션) 결과를 찾아주는 것. Type t = Type.GetType( fullName );
// 후기 바인딩: 타입을 가지고 인스턴스를 만들고 object o = Activator.CreateInstance(t);
// 폼을 보여 줌 Form f = (Form) o; f.Show(); }
또 이렇게 폼을 리플렉션을 이용하여 작업을 하게되면 폼을 독립된 DLL 파일로 개발하고 폼을 업데이트 하는 경우 해당 DLL 파일만 업데이트 하면 되고....
4) COM 개체를 후기바인딩으로 불러 사용
private void OpenExcel() { // 리플렉션 Type excel = Type.GetTypeFromProgID("Excel.Microsoft");
// 후기바인딩 object objExcel = Activator.CreateInstance(excel) object[] param = object[1]; param[0]=true; excel.InvokeMember("Visible", BindingFlags.SerProperty, null, objExcel, param); }
이렇듯 런타임에 동적으로(융통성있게) 개체를 가지고 작업을 할 수 있습니다.
후기바인딩으로 인스턴스를 만드는데 쓰이는 Activator의 메소드들은 다음과 같습니다.
CreateComInstanceFrom() CreateInstanceFrom() GetObject() CreateInstance()
도움말을 한번 찾아보십시오. 이것을 알면 리플렉션을 어떻게 사용할 것인가에 대해 좀더 알 수도 있을 겁니다.
5) 런타임으로 스크립트를 작성하고 실행하거나 컴파일을 하거나 새로운 타입을 동적으로 생성하는 등 고급 작업을 할 수 있습니다. 기타 VS.NET의 IDE와 같은 것을 만들 수도 있겠습니다. 이 부분은 나중에 개념 잡으시면서 접해보도록 하십시오. |
'프로그래밍(Programming) > C#' 카테고리의 다른 글
C# - Yield (0) | 2015.09.02 |
---|---|
C# | DLL 만들고 사용하기 (0) | 2015.09.02 |
열거형 GetEnumerator(), IEnumerable, IEnumerator 정의 (0) | 2015.09.01 |
delegate 와 event 차이 , 이벤트 인스턴스 저장 (0) | 2015.09.01 |
delegate (0) | 2015.08.31 |