CreateDelegate:“无法绑定到目标方法,因为其签名与委托类型的签名不兼容。”

Mek*_*ebo 2 c#

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

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

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

定义DELEGATEMETHOD如下:

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

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

public delegate void LogHandler(DateTime dateTime, string connectorName, string severity, string details);
public event LogHandler OnLogEventReceived;
Run Code Online (Sandbox Code Playgroud)

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

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

shi*_*ngo 5

如果您阅读文档,您会发现您选择的方法是静态方法。您应该使用实例方法的方法,例如CreateDelegate(Type, Object, MethodInfo)。在这种情况下,您需要提供一个类的实例Handler

Delegate.CreateDelegate(@event?.EventHandlerType, new Handler(), eventHandler);
Run Code Online (Sandbox Code Playgroud)