【发布时间】:2010-06-25 18:22:09
【问题描述】:
我知道EventInfo.AddEventHandler(...) 方法可用于将处理程序附加到事件。但是,如果我什至无法定义事件处理程序的正确签名,例如,我什至没有对处理程序预期的事件参数的引用,该怎么办?
我会用正确的代码解释问题。
// 解决方案中所有可用的场景,零反射场景。
internal class SendCommentsManager
{
public void Customize(IRFQWindowManager rfqWindowManager)
{
rfqWindowManager.SendComment += HandleRfqSendComment;
}
private void HandleRfqSendComment(object sender, SendCommentEventArgs args)
{
args.Cancel = true;
}
}
现在,我想通过使用反射来实现相同的目标。我已经能够弄清楚其中的大部分,但是当我将代表附加到事件时(使用AddEventHandler),它会抛出"Error binding to target method." 异常。
我了解此异常背后的原因,将错误的委托附加到事件。但必须有某种方法来实现这一点。
internal class SendCommentsManagerUsingReflection
{
public void Customize(IRFQWindowManager rfqWindowManager)
{
EventInfo eventInfo = rfqWindowManager.GetType().GetEvent("SendComment");
eventInfo.AddEventHandler(rfqWindowManager,
Delegate.CreateDelegate(eventInfo.EventHandlerType, this, "HandleRfqSendComment"));
//<<<<<<<<<<ABOVE LINE IS WHERE I AM GOING WRONG>>>>>>>>>>>>>>
}
private void HandleRfqSendComment(object sender, object args)
{
Type sendCommentArgsType = args.GetType();
PropertyInfo cancelProperty = sendCommentArgsType.GetProperty("Cancel");
cancelProperty.SetValue(args, true, null);
}
}
【问题讨论】:
-
为什么不使用 SendCommentEventArgs 作为第二个参数?顺便说一句:看看:msdn.microsoft.com/library/…
-
我不想引用具有“SendCommentEventArgs”的最新版本的 dll。如果我可以使用“SendCommentEventArgs”,则无需使用反射附加事件处理程序。
标签: c# events reflection event-handling delegates