我知道这与此问题略有重复:Blocking and waiting for an event
但是,我在编写 EventWaiter 的过程中遇到了问题。这是我一直在研究的(主要)简化版本:
public class EventWaiter
{
private AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
private EventInfo _event = null;
private object _eventContainer = null;
public EventWaiter(object eventContainer, string eventName)
{
_eventContainer = eventContainer;
_event = eventContainer.GetType().GetEvent(eventName);
}
public void WaitForEvent()
{
MethodInfo method = this.GetType().GetMethod("DynamicCaller");
Delegate handler = Delegate.CreateDelegate(this._event.EventHandlerType, this, method);
_event.AddEventHandler(_eventContainer, handler);
_autoResetEvent.WaitOne();
_event.RemoveEventHandler(_eventContainer, _handler);
}
public void DynamicCaller(/* insert magic here */)
{
_autoResetEvent.Set();
}
}
用法很简单:
EventWaiter ew = new EventWaiter(someClass, "someEvent");
ew.WaitForEvent();
基本上正在发生的事情是将DynamicCaller
void 注册为该事件的处理程序。问题是,事件有不同的签名,我希望能够处理事件而不管使用的委托。
我可以使用 this._event.EventHandlerType 获取委托的类型,但是无论委托是什么,我如何使用它来创建一个完全可重用的类?如果 DynamicCaller 参数与事件委托参数不完全相同,我会得到一个异常。
作为旁注,我对框架中的代码做了很多研究,如果我可以访问其中的一些,我认为这会很容易。太糟糕了,我需要的很多类都是框架内部的。