본문 바로가기
프로그래밍/C#

리플렉션

by 뽀도 2017. 8. 13.

닷넷 응용프로그램의 어셈블리 파일에는 메타데이터가 들어있다.

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

댓글