C# 嵌套内部类型的CreateDelegate

C# 嵌套内部类型的CreateDelegate,c#,reflection,C#,Reflection,我正在尝试将方法转换为内部(嵌套)委托类型。问题是,由于它是内部的,Delegate.CreateDelegate失败并引发异常 System.ArgumentException:无法绑定到目标方法,因为其签名或安全透明性与委托类型的签名或安全透明性不兼容 以下是我试图实现这一目标的相关代码 // The method to convert to the internal delegate type private void OnEnterMenuMode(object sender, Even

我正在尝试将方法转换为内部(嵌套)委托类型。问题是,由于它是内部的,
Delegate.CreateDelegate
失败并引发异常

System.ArgumentException:
无法绑定到目标方法,因为其签名或安全透明性与委托类型的签名或安全透明性不兼容

以下是我试图实现这一目标的相关代码

// The method to convert to the internal delegate type
private void OnEnterMenuMode(object sender, EventArgs e);

// The internal nested delegate type
public sealed class KeyboardNavigation {
internal delegate bool EnterMenuModeEventHandler(object sender, EventArgs e);

// The code used to create the delegate
object instance; // Owner of OnEnterMenuMode
EventInfo eventInfo; // The internal event
Delegate.CreateDelegate(eventInfo.EventHandlerType, instance,
    ((Action<object,EventArgs>)method).Method);
//要转换为内部委托类型的方法
私有void OnEnterMenuMode(对象发送方、事件参数e);
//内部嵌套委托类型
公共密封类键盘导航{
内部委托bool EnterMenuModeEventHandler(对象发送方,EventArgs e);
//用于创建委托的代码
对象实例;//OnEnterMenuMode的所有者
EventInfo EventInfo;//内部事件
CreateDelegate(eventInfo.EventHandlerType,实例,
((动作)方法);

我通过一个
构造函数info
和一个函数
IntPtr
构造委托,设法找到了一个解决方案

object instance; // Owner of OnEnterMenuMode
EventInfo eventInfo; // The internal event
// There is only one constructor for a `Delegate`, so this
// just makes it easier to find without all of the arguments.
ConstructorInfo constructor = eventInfo.EventHandlerType.GetConstructors()[0];
// Delegate constructors take arguments of `(object, IntPtr)`.
// Where `IntPtr` is a pointer to the method.
IntPtr ptr = ((Action<object,EventArgs>)method)
    .Method.MethodHandle.GetFunctionPointer();
return (Delegate) constructor.Invoke(new object[] { instance, ptr });
对象实例;//OnEnterMenuMode的所有者
EventInfo EventInfo;//内部事件
//“委托”只有一个构造函数,因此
//只是让它更容易找到没有所有的论点。
ConstructorInfo构造函数=eventInfo.EventHandlerType.GetConstructors()[0];
//委托构造函数的参数为`(object,IntPtr)`。
//其中,`IntPtr`是指向该方法的指针。
IntPtr ptr=((操作)方法)
.Method.MethodHandle.GetFunctionPointer();
return(Delegate)constructor.Invoke(新对象[]{instance,ptr});

Action用于
void
方法,但要引用的方法返回
Boolean
bool
)值。这就是你得到错误的原因。这与它是嵌套类型无关。编辑,我很抱歉。在我将函数声明设置为
void
return之前,我复制了一个旧版本的函数声明。它仍然会产生相同的错误。如果这样做会造成伤害,那么不要这样做。你不应该能够在对于您无法访问的类型,请停止尝试这样做,因为这样做是错误的。@EricLippert我很惊讶听到您这么说,反射在解决外部代码中的错误方面有很多很好的用途。@Dai:如果有人将其标记为内部,那是因为它是程序集的实现细节,而不是p的一部分公共表面。