2013-12-19 31 views
2

在Visual Studio 2013中进行调试时,我想知道由实现INotifyPropertyChanged的某个类(称为Publisher)发布的事件PropertyChanged的订阅者数量。如何访问PropertyChanged事件的订阅者?

我研究了一下,发现这应该可以调用GetInvocationList()并计算返回数组中的元素。所以我在我的代码中设置断点,并试图把这种立即窗口称为Publisherpublisher的对象上:

publisher.PropertyChanged.GetInvocationList() 

不过,我得到这个错误信息:

The event 'System.ComponentModel.INotifyPropertyChanged.PropertyChanged' can only appear on the left hand side of += or -= 

我做了什么错? 我如何访问PropertyChanged的用户?

+0

http://stackoverflow.com/a/1129530/736079 – jessehouwing

+0

根据您尝试调试的问题,内存分析器可能会告诉你你需要什么。 –

回答

4

我该如何访问订购者PropertyChanged

你基本上没有。事件只有支持订阅和取消订阅功能。

我研究了一下,发现这应该可能调用GetInvocationList()并计算返回数组中的元素。

这假设你可以得到底层委托字段 - 如果还有之一。有可能没有 - 有很多方法可以实现事件,就像有很多方法可以实现一个属性一样。

基本上,你要求的是打破事件的封装模型。尽管在某些使用反射的情况下可以解决这个问题,但您应该意识到您正在与系统的设计进行斗争。

请参阅我的文章events and delegates了解更多关于两者之间的差异。

+0

我明白了,感谢您的文章链接。 – elnigno

1

你要求做的事情并不简单。并没有标准的方法来实现它 - 基本上你可以破解现有的实现,但解决方案不能保证在未来工作。

我设法读取用户到一个事件,这是项目的根网址:http://www.codinghelmet.com/?path=net/sysexpand/reflection

起点,从中可以找到我在那里通过用户迭代是寻找在这个AddMonitoredObject方法页:http://www.codinghelmet.com/?path=net/sysexpand/reflection/source/dynevsubscr

希望这会有所帮助。但请记住,这个解决方案是一个破解。

+0

谢谢,但这对我的需求似乎有点矫枉过正。 – elnigno