2

这是我正在使用的内容:

我的项目的一部分是一个 Windows 窗体应用程序。我想基本上捕捉每一个触发并拥有听众的事件。所以一些按钮的点击事件,一些复选框的检查事件,基本“控制”事件列表中的所有内容。所以那个事件仍然会触发,但也会触发我的事件。

是否有一个通用的“触发某些事件”事件我可以利用,或者有没有一种方法使用反射来枚举我的表单中的所有对象,解析所有事件,解析具有侦听器的事件,然后订阅所有除了他们已经去的地方之外,他们还参加了其他地方的一般活动吗?

有人知道怎么做吗?

4

2 回答 2

4

你根本不能这样做:一个事件是一个只有“订阅”和“取消订阅”功能的黑盒子。因此,虽然您可以使用反射来找出所有事件,但您无法可靠地检测到哪些事件已被订阅。对于类似字段的事件,您可以获取支持字段并检查它是否为空,但即使这样也不可靠 - 为了避免空检查,作者可能编写了如下内容:

public event EventHandler SomeEvent = delegate {};

对于其他事件,您必须弄清楚订阅该事件的实际作用——例如,它可能使用EventHandlerList.

基本上,你应该重新考虑你的设计,这样你就不需要这样做了。

于 2010-09-10T16:13:39.907 回答
0

订阅事件被触发的事实是否表明它有订阅者?因此,您只需要一个可订阅事件列表,您可以在intercepted call.

AOP您可以使用任何框架拦截呼叫。例如,通过使用Unity Interception,您可以执行以下操作:

public IMethodReturn Invoke(IMethodInvocation input, 
    GetNextHandlerDelegate getNext)
{
    // 1. assuming that you are keeping a list of method names 
    // that are being subscribed to.
    // 2. assuming that if the event is fired, then it must have
    // been subscribed to... 
    if (MyReflectedListOfSubscribedEvents.Contains(input.MethodBase.ToString())
    {
        HandleItSomeHow();
    }

    // process the call...
    return getNext().Invoke(input, getNext);
}
于 2010-09-10T17:57:00.297 回答