You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delegate.CreateDelegate绑定报错:签名匹配仍提示不兼容,求排查方案

问题原因及修复方案

核心问题1:AddEventHandler参数类型错误

EventInfo.AddEventHandler的第一个参数要求是事件所属的实例对象,而你传入的是Type类型的type变量,完全不符合方法要求,会直接导致绑定失败。

核心问题2:实例方法创建委托时缺少实例引用

你的LogHandler是Handler类的实例方法,使用Delegate.CreateDelegate创建委托时,必须传入Handler类的实例对象作为第二个参数(用来指定方法所属的实例),而你直接传了MethodInfo,CLR会误以为你要绑定静态方法,自然触发签名不兼容的错误。


修正后的代码

// 注意:需要传入事件所属的实例对象,以及Handler类的实例
private void AttachToEvent(object eventOwnerInstance, Handler handlerInstance)
{
    if (eventOwnerInstance == null || handlerInstance == null) return;
    Type type = eventOwnerInstance.GetType();

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

        var eventHandlerMethod = typeof(Handler).GetMethod(DELEGATEMETHOD, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
        if (eventHandlerMethod == null) continue;

        // 创建委托时传入Handler实例
        var @delegate = Delegate.CreateDelegate(@event.EventHandlerType, handlerInstance, eventHandlerMethod);
        // 传入事件所属的实例对象
        @event.AddEventHandler(eventOwnerInstance, @delegate);
    }
}

额外验证点

  • 确认EVENTNAME常量的值是"OnLogEventReceived",和目标事件名称完全一致(区分大小写)。
  • 确认动态加载的程序集里的LogHandler委托和你的Handler.LogHandler方法的参数类型、顺序、返回值完全匹配(避免出现不同程序集的同名类型导致的隐性不兼容)。

内容的提问来源于stack exchange,提问作者Mekroebo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:05:51