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
    变量传递到生成的方法中
每当我尝试调用该方法时,我都会收到MethodAccessException

这是因为为C#
(t)=>t.DoSomething
lambda生成的方法是私有的。这个lambda也可能不是静态的,这取决于它从外部方法捕获的局部变量。您正在发出
callvirt
指令,但似乎没有提供实例

您可以通过在Reflector中加载应用程序的代码并查看
(t)=>t.DoSomething
lambda的实现来验证这一点

您需要:

  • 将lambda升级到外部可见类中的real
    public static
    方法
  • 找到在IL方法中包含
    Action
    类型的参数的方法,生成调用
    Action.Invoke的代码,然后将
    Action
    变量传递到生成的方法中

查看这是否与提及的内容相关。

查看这是否与提及的内容相关。

如果使用动态方法,则可以使用抖动中的跳过可见性检查

如果使用动态方法,可以在抖动中使用跳过可见性检查

我可以看出MethodInfo IsPrivate是真的,有没有办法改变这一点?否则我可以只使用一个公共静态成员,但是使用Lambda更整洁:)谢谢,没有办法改变这个;这是C#编译器的一个实现细节。进一步想一想,更好的选择可能是找到一种方法,将
操作
委托传递到生成的方法中,方法可以是添加一个参数,或者使生成的方法成为类实例成员并在该类上设置一个字段。因为您将通过代理调用lambda,所以您不会对lambda的实现方式感到敏感。是的,这似乎是一个解决方案,谢谢!我会投赞成票,但不能!dohI可以看到MethodInfo IsPrivate是真的,有办法改变吗?否则我可以只使用一个公共静态成员,但是使用Lambda更整洁:)谢谢,没有办法改变这个;这是C#编译器的一个实现细节。进一步想一想,更好的选择可能是找到一种方法,将
操作
委托传递到生成的方法中,方法可以是添加一个参数,或者使生成的方法成为类实例成员并在该类上设置一个字段。因为您将通过代理调用lambda,所以您不会对lambda的实现方式感到敏感。是的,这似乎是一个解决方案,谢谢!我会投赞成票,但不能!doh