在Visual Studio 2013中进行调试时,我想知道实现PropertyChanged
的某个类(我们称之为Publisher
)发布的事件INotifyPropertyChanged
的订阅者数量
我研究了一下,发现这应该可以调用GetInvocationList()
并计算返回数组中的元素。所以我在我的代码中设置了一个断点,并尝试在立即窗口中对类publisher
中名为Publisher
的对象进行调用:
publisher.PropertyChanged.GetInvocationList()
但是,我收到此错误消息:
The event 'System.ComponentModel.INotifyPropertyChanged.PropertyChanged' can only appear on the left hand side of += or -=
我做了什么有什么问题?
如何访问PropertyChanged
的订阅者?
答案 0 :(得分:4)
如何访问
PropertyChanged
的订阅者?
基本上,你没有。仅 事件支持订阅和取消订阅功能。
我研究了一下,发现这应该可以调用GetInvocationList()并计算返回数组中的元素。
假设您可以访问基础委托字段 - 如果 那么。可能没有 - 有很多方法可以实现事件,就像有很多方法可以实现一个属性。
基本上,你要求的东西打破了事件的封装模型。虽然在某些情况下使用反射可以解决这个问题,但是你应该意识到你正在与系统的设计作斗争。
有关两者之间的差异,请参阅我在events and delegates上的文章。
答案 1 :(得分:1)
你要做的事情并不简单。并且没有标准的方法可以做到 - 基本上你可以破解现有的实现,但不能保证解决方案在将来有效。
我设法读取事件的订阅者,这是项目的根URL:http://www.codinghelmet.com/?path=net/sysexpand/reflection
从中可以找到我在订阅者中迭代的位置的起点是在此页面上查找AddMonitoredObject方法:http://www.codinghelmet.com/?path=net/sysexpand/reflection/source/dynevsubscr
希望这会有所帮助。但请记住,这个解决方案是一个黑客攻击。