코드에서 반향을 통해 비교 <> 삭제를 만들고 싶습니다. 나는이 있습니다 :즉석에서 비교 <>를 만드는 방법은 무엇입니까?
마지막 줄에 ArgumentException이 발생합니다. MethodInfo는 런타임 MethodInfo 개체 여야합니다. 나는 반성에 처음이고 방출하고, 단지 작은 단계가 빠져있다라고하는 감각을 가지고있다!?
편집 : -
나는 새로운 국회를 만드는 결합 아니에요 나는 또한 DynamicMethod을 시도 :
는var returnType = typeof (Int32);
var parameters = typeof(Comparison<>).GetMethod("Invoke").GetParameters().Select(x => x.ParameterType).ToArray();
var handler = new DynamicMethod("", returnType, parameters);
var generator = handler.GetILGenerator();
foreach (var parameter in parameters)
{
var localVariable = generator.DeclareLocal(parameter);
generator.Emit(OpCodes.Ldloc, localVariable);
}
if (returnType != null)
{
var returnValue = generator.DeclareLocal(returnType);
generator.Emit(OpCodes.Ldloc, returnValue);
}
generator.Emit(OpCodes.Ret);
handler.CreateDelegate(typeof(Comparison<>));
은 BadImageFormatException이 예외 :/
솔루션 :
var returnType = typeof (Int32);
var methodParameters = typeof(Comparison<>).GetMethod("Invoke").GetParameters().Select(x => x.ParameterType.ToString()).ToArray();
AppDomain domain = AppDomain.CurrentDomain;
AssemblyName aname = new AssemblyName("MyEmissions");
AssemblyBuilder assemBuilder = domain.DefineDynamicAssembly(aname, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder modBuilder = assemBuilder.DefineDynamicModule("MainModule", "MyEmissions.dll");
TypeBuilder tb = modBuilder.DefineType("Widget", TypeAttributes.Public);
MethodBuilder mb = tb.DefineMethod("Echo", MethodAttributes.Public | MethodAttributes.Static);
GenericTypeParameterBuilder[] typeParameters = mb.DefineGenericParameters(methodParameters);
mb.SetReturnType(returnType);
mb.SetParameters(typeParameters);
ILGenerator gen = mb.GetILGenerator();
gen.Emit(OpCodes.Ldnull);
gen.Emit(OpCodes.Ret);
var dt = tb.CreateType();
var mi = dt.GetMethod("Echo");
var gm = mi.MakeGenericMethod(new[] { typeof(string), typeof(string) });
var parameter = MulticastDelegate.CreateDelegate(typeof(Comparison<string>), gm);
I * suspect * 당신은'TypeBuilder.CreateType'을 호출해야합니다. 이처럼 새로운 어셈블리를 만들려면 꼭 * 필요합니까? 나는'DynamicMethod'가 당신에게 더 잘 맞을 것으로 생각합니다. [어떻게 안정적으로 RuntimeMethodInfo하는 MethodBuilder을 변환하는 Reflection.Emit를?] [1] [1] : –
체크 스택 오버 플로우의이 게시물은 당신이 도움이 될 수 http://stackoverflow.com/questions/3031183/reflection -emit-how-to-convert-methodbuilder-to-runtimemethodinfo-reliableably – DeveloperX
방출하려고하는 것의 일부 가짜 C#을 제공 할 수 있습니까? – leppie