这是我正在使用的内容:
我的项目的一部分是一个 Windows 窗体应用程序。我想基本上捕捉每一个触发并拥有听众的事件。所以一些按钮的点击事件,一些复选框的检查事件,基本“控制”事件列表中的所有内容。所以那个事件仍然会触发,但也会触发我的事件。
是否有一个通用的“触发某些事件”事件我可以利用,或者有没有一种方法使用反射来枚举我的表单中的所有对象,解析所有事件,解析具有侦听器的事件,然后订阅所有除了他们已经去的地方之外,他们还参加了其他地方的一般活动吗?
有人知道怎么做吗?
这是我正在使用的内容:
我的项目的一部分是一个 Windows 窗体应用程序。我想基本上捕捉每一个触发并拥有听众的事件。所以一些按钮的点击事件,一些复选框的检查事件,基本“控制”事件列表中的所有内容。所以那个事件仍然会触发,但也会触发我的事件。
是否有一个通用的“触发某些事件”事件我可以利用,或者有没有一种方法使用反射来枚举我的表单中的所有对象,解析所有事件,解析具有侦听器的事件,然后订阅所有除了他们已经去的地方之外,他们还参加了其他地方的一般活动吗?
有人知道怎么做吗?
你根本不能这样做:一个事件是一个只有“订阅”和“取消订阅”功能的黑盒子。因此,虽然您可以使用反射来找出所有事件,但您无法可靠地检测到哪些事件已被订阅。对于类似字段的事件,您可以获取支持字段并检查它是否为空,但即使这样也不可靠 - 为了避免空检查,作者可能编写了如下内容:
public event EventHandler SomeEvent = delegate {};
对于其他事件,您必须弄清楚订阅该事件的实际作用——例如,它可能使用EventHandlerList
.
基本上,你应该重新考虑你的设计,这样你就不需要这样做了。
订阅事件被触发的事实是否表明它有订阅者?因此,您只需要一个可订阅事件列表,您可以在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);
}