C# 使用;方法“;操作中的MethodInfo属性<;T>;il.EmitCall中的委托
这样的事情可能吗C# 使用;方法“;操作中的MethodInfo属性<;T>;il.EmitCall中的委托,c#,.net,reflection.emit,C#,.net,Reflection.emit,这样的事情可能吗 // // create a delegate Action<Type> action = (t) => t.DoSomething; // // get the IL generator for a method ILGenerator il = myMethodBuilder.GetILGenerator(); // // try and call the delegate il.EmitCall(OpCodes.Callvirt, action.M
//
// create a delegate
Action<Type> action = (t) => t.DoSomething;
//
// get the IL generator for a method
ILGenerator il = myMethodBuilder.GetILGenerator();
//
// try and call the delegate
il.EmitCall(OpCodes.Callvirt, action.Method, null);
//
//创建一个委托
动作动作=(t)=>t.剂量;
//
//获取方法的IL生成器
ILGenerator il=myMethodBuilder.GetILGenerator();
//
//试着给代表打电话
EmitCall(OpCodes.Callvirt,action.Method,null);
每当我尝试调用该方法时,我都会收到MethodAccessException
谢谢
每当我尝试调用该方法时,我都会收到MethodAccessException
这是因为为C#(t)=>t.DoSomething
lambda生成的方法是私有的。这个lambda也可能不是静态的,这取决于它从外部方法捕获的局部变量。您正在发出callvirt
指令,但似乎没有提供实例
您可以通过在Reflector中加载应用程序的代码并查看(t)=>t.DoSomething
lambda的实现来验证这一点
您需要:
- 将lambda升级到外部可见类中的real
方法public static
- 找到在IL方法中包含
类型的参数的方法,生成调用Action
Action.Invoke的代码,然后将
变量传递到生成的方法中Action
(t)=>t.DoSomething
lambda生成的方法是私有的。这个lambda也可能不是静态的,这取决于它从外部方法捕获的局部变量。您正在发出callvirt
指令,但似乎没有提供实例
您可以通过在Reflector中加载应用程序的代码并查看(t)=>t.DoSomething
lambda的实现来验证这一点
您需要:
- 将lambda升级到外部可见类中的real
方法public static
- 找到在IL方法中包含
类型的参数的方法,生成调用Action
Action.Invoke的代码,然后将
变量传递到生成的方法中Action
操作
委托传递到生成的方法中,方法可以是添加一个参数,或者使生成的方法成为类实例成员并在该类上设置一个字段。因为您将通过代理调用lambda,所以您不会对lambda的实现方式感到敏感。是的,这似乎是一个解决方案,谢谢!我会投赞成票,但不能!dohI可以看到MethodInfo IsPrivate是真的,有办法改变吗?否则我可以只使用一个公共静态成员,但是使用Lambda更整洁:)谢谢,没有办法改变这个;这是C#编译器的一个实现细节。进一步想一想,更好的选择可能是找到一种方法,将操作
委托传递到生成的方法中,方法可以是添加一个参数,或者使生成的方法成为类实例成员并在该类上设置一个字段。因为您将通过代理调用lambda,所以您不会对lambda的实现方式感到敏感。是的,这似乎是一个解决方案,谢谢!我会投赞成票,但不能!doh