런타임에 새 유형을 작성한 다음 표현식을 해당 유형의 메소드로 컴파일 할 수 있습니다.
런타임에 새 어셈블리와 새 모듈을 만들어야합니다. 생성 한 후에는 원하는만큼 많은 유형을 생성 할 수 있습니다. 여기에 조립 모듈 생성하는 코드 샘플입니다 :
var typeBuilder = moduleBuilder.DefineType("MyNewType");
그리고 다음과 같은 새로운 방법 : 이제
var assemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName {Name = "MyNewAssembly"},
AssemblyBuilderAccess.Run);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyNewModule");
, 당신은이 같은 새로운 유형을 정의하는 모듈 빌더를 사용할 수 있습니다 :
var methodBuilder =
typeBuilder.DefineMethod(
"MyNewMethod",
MethodAttributes.Public | MethodAttributes.Static,
typeof(int), //returns an int
new Type[]{}); //takes no parameters
메서드 서명은 표현 대리자 형식과 일치해야합니다.
var type = typeBuilder.CreateType();
그런 다음 우리에 Delegate.CreateDelegate
방법을 사용하십시오
var expression = Expression.Lambda(typeof(Func<int>), Expression.Constant(0));
expression.CompileToMethod(methodBuilder);
우리는 유형 빌더의 실제 유형을 생성합니다
다음으로, 우리는 CompileToMethod
방법을 사용하여 새로운 방법으로 표현을 컴파일 다음과 같이 새로 생성 된 정적 메서드에 대한 대리자를 만듭니다.
Func<int> func =
(Func<int>)Delegate.CreateDelegate(
typeof(Func<int>),
type.GetMethod("MyNewMethod"));
int value = func(); //Test
이제 func.Method.DeclaringType
은 동적으로 생성 된 유형을 반환합니다.
이 코드를 사용하면 쉽게 사용할 수있는 몇 가지 도우미 메서드를 생성 할 수 있습니다.
런타임에 새 유형을 생성하는 옵션이 있습니까? –
@ YacoubMassad 예.하지만 가장 휴대 가능한 방법을 선호합니다. – Vlad