Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Delegate.CreateDelegate,lambda作为方法生成;方法参数长度不匹配“;例外_C#_.net_Lambda_Delegates_Mono - Fatal编程技术网

C# Delegate.CreateDelegate,lambda作为方法生成;方法参数长度不匹配“;例外

C# Delegate.CreateDelegate,lambda作为方法生成;方法参数长度不匹配“;例外,c#,.net,lambda,delegates,mono,C#,.net,Lambda,Delegates,Mono,我有一个问题,Test1生成“System.ArgumentException:方法参数长度不匹配”,而Test2和Test3通过得很好。我需要使用反射订阅一个事件,如果我使用简单的方法,一切都可以正常工作,但是当我进入lambdas时,它就会停止工作 调试显示所有lambda为“Void m__0(Int32)”,这是事件的正确类型,与“eventInfo.EventHandlerType”相同 为什么会失败?或者,如何解决这个问题 c#是否向lambda创建的方法(如Test1)添加更多参数

我有一个问题,Test1生成“System.ArgumentException:方法参数长度不匹配”,而Test2和Test3通过得很好。我需要使用反射订阅一个事件,如果我使用简单的方法,一切都可以正常工作,但是当我进入lambdas时,它就会停止工作

调试显示所有lambda为“Void m__0(Int32)”,这是事件的正确类型,与“eventInfo.EventHandlerType”相同

为什么会失败?或者,如何解决这个问题

c#是否向lambda创建的方法(如Test1)添加更多参数

::请在此处完成代码:

public class A
{
    public void Test1()
    {
        var str = "aa";
        B.Subscribe(typeof(C), "myEvent", (int a) => { var any = str; }, null);
    }

    public void Test2()
    {
        B.Subscribe(typeof(C), "myEvent", (int a) => { var any = a; }, null);
    }

    public void Test3()
    {
        B.Subscribe<int>(typeof(C), "myEvent", callback, this);
    }

    public void callback(int a) { }
}

public static class B
{
    public static void Subscribe<T>(Type type, string eventName, Action<T> callback, object target)
    {
        var eventInfo = type.GetEvent(eventName, BindingFlags.GetField | BindingFlags.Public | BindingFlags.Static);
        var handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, target, callback.Method);
        eventInfo.AddEventHandler(null, handler); 
    }

}

public sealed class C
{
    public static event Action<int> myEvent;
}

这是不同的问题吗?编辑#2,事件需要
MyDel
type,但获取操作Int32。我如何才能从
操作
转换为MyDel或更好的版本,转换为
事件信息.EventHandlerType
,因为我不知道会发生什么类型的事件。

事实上,在进一步调查后,我注意到我的
目标
不好

对于类中定义的方法,可以将类实例作为目标。 对于lambda,我认为它是null,至少它可以使用null,只要它不干扰创建lambda的方法中定义的局部变量。

因此,Action有一个属性Target,在
Delegate.CreateDelegate
中使用
callback.Target
解决了这个问题

lambda的目标实际上持有对类实例及其所接触的所有局部变量的引用(调试器显示了它)


奇怪的是,它在最新的.NET上运行,也许mono和.NET之间有点不同。

在MS.NET上运行良好。可能是一些单声道问题?似乎是单声道问题。如果使用
GetInvocationList()
(即返回列表的第一个元素)而不是
方法,会发生什么情况?后者应该有效,但正如@VinSmile所说,可能是一个单一问题。假设是同一个bug,则可能是重复的。至少是相关的。@PeterDuniho GetInvocationList()[0]修复了上述示例中的问题,但在整个项目中失败。更新了问题。到目前为止谢谢你,至少它正在向前发展。
public sealed class C
{
    public static event MyDel myEvent;
    public delegate void MyDel(int a);
}