gpt4 book ai didi

c# - 创建委托(delegate) : 'Cannot bind to the target method because its signature is not compatible with that of the delegate type.'

转载 作者:行者123 更新时间:2023-12-03 08:00:38 25 4
gpt4 key购买 nike

我遇到了一个我不明白的奇怪问题。

我想做的事情非常简单:动态加载程序集,找到具有预定义名称的事件并 Hook 该事件。

执行此操作的代码很简单:

private void AttachToEvent(Type type)
{
if (type == null) return;

foreach (var @event in type.GetEvents())
{
if (@event.Name != EVENTNAME) continue;

var eventHandler = typeof(Handler).GetMethod(DELEGATEMETHOD, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

if (@event == null || eventHandler == null) return;

var @delegate = Delegate.CreateDelegate(@event?.EventHandlerType, eventHandler);

@event.AddEventHandler(type, @delegate);
}
}

DELEGATEMETHOD 定义如下:

public void LogHandler(DateTime dateTime, string connectorName, string severity, string details)
{
// do something with the received log event...
}

在加载的程序集中,事件定义如下:

public delegate void LogHandler(DateTime dateTime, string connectorName, string severity, string details);
public event LogHandler OnLogEventReceived;

无论我尝试做什么,我总是会收到“无法绑定(bind)到目标方法,因为它的签名与委托(delegate)类型的签名不兼容。”错误,(据我所知)这意味着委托(delegate)中定义的参数与目标方法中的参数不同。但就我而言......它们确实匹配!

有人知道这里发生了什么吗?

最佳答案

如果您阅读the documentation ,你会发现你选择的方法是静态方法。您应该使用一个方法作为实例方法,例如CreateDelegate(类型、对象、MethodInfo)。在这种情况下,您需要提供 Handler 类的实例。

Delegate.CreateDelegate(@event?.EventHandlerType, new Handler(), eventHandler);

关于c# - 创建委托(delegate) : 'Cannot bind to the target method because its signature is not compatible with that of the delegate type.' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74340240/

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