gpt4 book ai didi

c# - 使用 lambda 作为方法的 Delegate.CreateDelegate 产生 "method argument length mismatch"异常

转载 作者:行者123 更新时间:2023-12-04 13:23:52 29 4
gpt4 key购买 nike

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

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

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

C# 是否像 Test1 一样向由 lambda 创建的方法添加更多参数?

::完整代码在这里:

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;
}

编辑:

显然这是 Mono 错误。获取委托(delegate)的 GetInvocationList()[0] 解决了上例中的问题。

但是订阅事件会产生“System.InvalidCastException:无法从源类型转换为目标类型。”如果事件不是 Action 类型而是自定义委托(delegate)类型:(如果类“C”是这样,它会抛出,如果类“C”是像上面那样,它会正常通过)

public sealed class C
{
public static event MyDel myEvent;
public delegate void MyDel(int a);
}

这是不同的问题吗?编辑 #2,事件预计 MyDel类型,但得到 Action Int32。如何从 Action<T> 转换到 MyDel 或更好,到 eventInfo.EventHandlerType ,因为我不知道会发生什么类型的事件。

最佳答案

实际上,经过进一步调查后,我注意到我的目标是错误的。

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

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

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

奇怪的是,它在最新的 .NET 上运行,可能是单声道和 .NET 之间的细微差别。

关于c# - 使用 lambda 作为方法的 Delegate.CreateDelegate 产生 "method argument length mismatch"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43464975/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com