닷넷 응용프로그램의 어셈블리 파일에는 메타데이터가 들어있다.
BCL에서 제공되는 리플렉션 관련 클래스를 이용하면 메타데이터 정보를 얻는 것이 가능하므로 이제 그 유용성을 직접 코드로 확인해 보자.
리플렉션은 C#코드가 빌드되어 어셈블리에 포함되는 경우 그에 대한 모든 정보를 조회할 수 있는 기술을 일컫는다.
using System;using System.Threading;using System.Collections.Generic;using static System.Net.Mime.MediaTypeNames;using System.Reflection;namespace csharp_study{class Program{static void Main(string[] args){AppDomain currentDomain = AppDomain.CurrentDomain;Console.WriteLine("Current Domain Name : " + currentDomain.FriendlyName);foreach(Assembly asm in currentDomain.GetAssemblies()){Console.WriteLine(" " + asm.FullName);foreach(Module module in asm.GetModules()){Console.WriteLine("Module : " + module.FullyQualifiedName);foreach (Type type in module.GetTypes()){Console.WriteLine("type : " + type.FullName);foreach(MemberInfo memberinfo in type.GetMembers()){Console.WriteLine("Member : " + memberinfo.Name);}foreach(ConstructorInfo ctorInfo in type.GetConstructors()){Console.WriteLine("Constructor : " + ctorInfo.Name);}foreach(EventInfo eventInfo in type.GetEvents()){Console.WriteLine("Event : " + eventInfo.Name);}foreach(FieldInfo fieldInfo in type.GetFields()){Console.WriteLine("field : " + fieldInfo.Name);}foreach (MethodInfo methodInfo in type.GetMethods()){Console.WriteLine("field : " + methodInfo.Name);}foreach (PropertyInfo propertyInfo in type.GetProperties()){Console.WriteLine("property : " + propertyInfo.Name);}}}}}}}리플렉션으로 메타데이터 조회만 할 수 있는것은 아니다. 타입을 생성할 수 있고, 그 타입에 정의된 메서드를호출할 수 있으며 심지어 필드/프로퍼티 값을 바꾸는 것도 가능하다.using System;using System.Threading;using System.Collections.Generic;using static System.Net.Mime.MediaTypeNames;using System.Reflection;namespace csharp_study{public class SystemInfo{bool _is64Bit;public SystemInfo(){_is64Bit = Environment.Is64BitOperatingSystem;Console.WriteLine("SystemInfo created.");}public void WriteInfo(){Console.WriteLine("OS == {0}bits", (_is64Bit == true) ? "64" : "32");}}class Program{static void Main(string[] args){// [강력하게 결합된 코드]//SystemInfo sysinfo = new SystemInfo();//sysinfo.WriteInfo();//[리플렉션을 사용한 느슨하게 결합된 코드]// 리플렉션을 이용한 생성Type systeminfoType = Type.GetType("csharp_study.SystemInfo");// objInstance = Activator.CreateInstance(systeminfoType);ConstructorInfo ctorInfo = systeminfoType.GetConstructor(Type.EmptyTypes);// Type.EmptyTypes 하면 기본 생성자 반환object objInstance = ctorInfo.Invoke(null);//Invoke 생성자를 호출 함으로써 객체를 만듬MethodInfo methodInfo = systeminfoType.GetMethod("WriteInfo");methodInfo.Invoke(objInstance, null);FieldInfo fieldInfo = systeminfoType.GetField("_is64Bit", BindingFlags.NonPublic | BindingFlags.Instance);object oldValue = fieldInfo.GetValue(objInstance);fieldInfo.SetValue(objInstance, !Environment.Is64BitOperatingSystem);methodInfo.Invoke(objInstance,null);}}}리플렉션의 특징을 이용하면 응용프로그램에 확장 모듈을 구현하는 것이 가능하다.[느슨한결합/강력한 결합 참고 사이트]http://hongjinhyeon.tistory.com/141
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[c#] Mutex , semaphore, monitor (0) | 2019.02.17 |
---|---|
[c#] local ip 찾는 함수 (0) | 2018.07.03 |
전처리기. (0) | 2017.08.13 |
c# ThreadPool 사용 (0) | 2017.06.26 |
C# Mutex 동기화 코드 (0) | 2017.06.21 |
댓글