我遇到了一个我不明白的奇怪问题。
我想做的事情非常简单:动态加载程序集,找到具有预定义名称的事件并挂钩到该事件。
执行此操作的代码很简单:
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)
无论我尝试做什么,我总是收到“无法绑定到目标方法,因为其签名与委托类型的签名不兼容”。错误(据我所知)意味着委托中定义的参数与目标方法中的参数不同。但就我而言……它们确实匹配!
有人知道这里发生了什么事吗?
如果您阅读文档,您会发现您选择的方法是静态方法。您应该使用实例方法的方法,例如CreateDelegate(Type, Object, MethodInfo)。在这种情况下,您需要提供一个类的实例Handler。
Delegate.CreateDelegate(@event?.EventHandlerType, new Handler(), eventHandler);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5121 次 |
| 最近记录: |