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
相关产品推荐
相关产品推荐

