3

我有一个将构造函数包装在动态工厂方法中的方法:

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.1newobj <ctor>ldnull所以问题肯定是由这两条IL指令引起的。进一步的实验表明,错误在于ldarg.1。(对于上面的具体示例,我已将其替换为 a ldstr <string>。)

有人看到这些 IL 指令有什么问题吗?

4

1 回答 1

6

这个方法是静态的,所以它没有this参数 as arg0。改变il.Emit(OpCodes.Ldarg_1);il.Emit(OpCodes.Ldarg_0);我来说很好。

于 2012-08-20T16:42:43.247 回答