我正在尝试使用Func,我可以使用它来访问属性的get方法,但是遇到了绊脚石。
下面的动态方法创建得很好,但是当它被调用时,我得到以下错误。
VerificationException,Operation可能会破坏运行时的稳定性。
我已经检查过il代码通过将它写入类而不是动态方法来发出有效函数,并且所有函数看起来都没问题。
我猜它与某些打字问题有关,但我不确定在哪里,所以感谢任何帮助。
示例类
public class DemoClass
{
public string Property{get;set;}
}
动态方法创建
var getMethods = new DynamicMethod(string.Empty,
typeof(string),
new Type[] {typeof(object) });
var ilGet = getMethods.GetILGenerator();
var falseGetLabel = ilGet.DefineLabel();
ilGet.Emit(OpCodes.Ldarg_1);
ilGet.Emit(OpCodes.Isinst, typeof(DemoClass));
ilGet.Emit(OpCodes.Brfalse_S, falseGetLabel);
ilGet.Emit(OpCodes.Ldarg_1);
ilGet.Emit(OpCodes.Isinst, typeof(DemoClass));
ilGet.Emit(OpCodes.Call, typeof(DemoClass).GetProperty("Property").GetMethod);
ilGet.Emit(OpCodes.Ret);
ilGet.MarkLabel(falseGetLabel);
ilGet.Emit(OpCodes.Newobj,
typeof(InvalidOperationException).GetConstructor(Type.EmptyTypes));
ilGet.Emit(OpCodes.Throw);
var f = (Func<object,string>)getMethods.CreateDelegate(
typeof(Func<object,string>));
var x = new DemoClass{Property = "9"};
Console.WriteLine(f(x)); <--- fails here
答案 0 :(得分:4)
您应该使用OpCodes.Ldarg_0
代替OpCodes.Ldarg_1
来获取第一个方法参数。