본문 바로가기
C# 공부

reflection

by Dev_Hugh 2021. 8. 26.
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));
        }
    }
}
  1. AssemblyBuilder 이용해 어셈블리 생성
  2. ModuleBuilder 이용해 1에서 생성한 어셈블리 안에 모듈을 만들어 넣기
  3. TypeBuilder 이용해 2에서 생성한 모듈안에 클래스(형식) 만들어 넣기
  4. 3에서 생성한 클래스 안에 메소드(Methodbuilder 이용)나 프로퍼티(PropertyBuilder 이용) 만들어 넣기
  5. 4에서 생성한 것이 메소드면, ILGenerator 이용해 메소드 안에 CPU가 실행할 IL 명령들 넣기

attributes

  • 코드에 대한 부가 정보를 기록하고 읽을 수 있는 기능
  • 주석은 사람이 읽고 쓰는 정보 애트리뷰트는 사람이 작성하고 컴퓨터가 읽는 정보
728x90
반응형

'C# 공부' 카테고리의 다른 글

thread  (0) 2021.08.28
serializable  (0) 2021.08.26
LINQ  (0) 2021.08.26
lambda  (0) 2021.08.26
dynamic  (0) 2021.08.26