728x90
반응형
Study about reflection and attributes
reflection
- 프로그램 실행 중 객체의 형식 이름, 프로퍼티 목록, 메소드 목록, 필드, 이벤트 목록 등 객체의 형식 정보를 들여다 볼 수 있는 기능
- 형식의 이름만 알고있으면 동적으로 인스턴스를 만들고 인스턴스의 메소드 호출 가능
- 새로운 데이터 형식을 동적으로 만들수있다.
- 모든 데이터 형식이 물려받은 Object 형식의 메소드를 알자
리플렉션을 이용해서 객체 생성하고 이용
- 코드 안에서 runtime에 특정 형식의 인스턴스를 만들면 프로그램이 동적으로 동작하게 구성할 수 있다.
형식 내보내기
- 프로그램 실행중 새 형식을 만들어 CLR의 메모리에 "내보내는" 기능
namespace EmitTest
{
public class MainAPP
{
static void Main()
{
AssemblyBuilder nesAssembly =
AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("CalculatorAssembly"), AssemblyBuilderAccess.Run);
ModuleBuilder newModule = new Assembly.DefineDynamicModule("Calculator");
TypeBuilder newType = newModule.DefineType("Sum1To100");
MethodBuilder newMethod = new Type.DefineMethod(
"Calculate", MethodAttributes.Public,
tydeof(int),
new Type[0]);
ILGenerator generator = newMethod.GetILGenerator();
generator.Emit(OpCodes.Ldc_l4,1);
for(int i=2; i<=100; i++)
{
generator.Emit(OpCodes.Ldc_l4, i);
generator.Emit(Opcodes.Add);
}
generator.Emit(OpCodes.Ret);
newType.CreateType();
object sum1To100 = Activator.Createlnstance(newType);
MethodInfo Calculate = sum1To100.GetType().GetMethod("Calculate");
Console.WriteLine(Calculate.Invoke(sum1To100, null));
}
}
}
- AssemblyBuilder 이용해 어셈블리 생성
- ModuleBuilder 이용해 1에서 생성한 어셈블리 안에 모듈을 만들어 넣기
- TypeBuilder 이용해 2에서 생성한 모듈안에 클래스(형식) 만들어 넣기
- 3에서 생성한 클래스 안에 메소드(Methodbuilder 이용)나 프로퍼티(PropertyBuilder 이용) 만들어 넣기
- 4에서 생성한 것이 메소드면, ILGenerator 이용해 메소드 안에 CPU가 실행할 IL 명령들 넣기
attributes
- 코드에 대한 부가 정보를 기록하고 읽을 수 있는 기능
- 주석은 사람이 읽고 쓰는 정보 애트리뷰트는 사람이 작성하고 컴퓨터가 읽는 정보
728x90
반응형