我有这个方法,它将构造函数包装在动态工厂方法中:
static Func<TArg1, TResult> ToFactoryMethod<TArg1, TResult>(this ConstructorInfo ctor)
where TResult : class
{
var factoryMethod = new DynamicMethod(
name: string.Format("_{0:N}", Guid.NewGuid()),
returnType: typeof(TResult),
parameterTypes: new Type[] { typeof(TArg1) });
ILGenerator il = factoryMethod.GetILGenerator();
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Ret);
return (Func<TArg1, TResult>)
factoryMethod.CreateDelegate(typeof(Func<TArg1, TResult>));
}
但是,以下代码会在VerificationException
上抛出.Invoke(…)
:
ConstructorInfo ctor = typeof(Uri).GetConstructor(new Type[] { typeof(string) });
Func<string, Uri> uriFactory = ctor.ToFactoryMethod<string, Uri>();
Uri uri = uriFactory.Invoke("http://www.example.com");
如果我替换ldarg.1
,则不会抛出异常; newobj <ctor>
ldnull
ldarg.1
,因此问题必须由这两条IL指令引起。进一步的实验表明错误在于ldstr <string>
。 (对于上面的具体示例,我已将其替换为{{1}}。)
有没有人看到这些IL说明有什么问题?
答案 0 :(得分:6)
此方法是静态的,因此它没有this
参数arg0
。 il.Emit(OpCodes.Ldarg_1);
改为il.Emit(OpCodes.Ldarg_0);
对我来说很好。