【问题标题】:How to access subscribers to PropertyChanged event? [duplicate]如何访问 PropertyChanged 事件的订阅者? [复制]
【发布时间】:2013-12-19 13:01:22
【问题描述】:

在 Visual Studio 2013 中调试时,我想知道某个实现 INotifyPropertyChanged 的类(我们称之为 Publisher)发布的事件 PropertyChanged 的订阅者数量。

我研究了一下,发现这应该可以调用GetInvocationList() 并计算返回数组中的元素。所以我在我的代码中设置了一个断点,并尝试在即时窗口中调用一个名为publisher 的对象,该对象属于Publisher 类:

publisher.PropertyChanged.GetInvocationList()

但是,我收到以下错误消息:

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

我所做的有什么问题? 如何访问PropertyChanged 的订阅者?

【问题讨论】:

标签: c# .net visual-studio events visual-studio-2013


【解决方案1】:

如何访问PropertyChanged 的订阅者?

基本上你不会。一个事件只有支持订阅和取消订阅功能。

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

假设您可以访问底层委托字段 - 如果甚至有 一个。可能没有 - 可以通过多种方式实现事件,就像可以通过多种方式实现属性一样。

基本上,您要求的内容会破坏事件的封装模型。虽然在某些情况下使用反射可以解决这个问题,但您应该意识到您正在与系统设计作斗争。

请参阅我在events and delegates 上的文章,了解有关两者之间差异的更多信息。

【讨论】:

  • 我明白了,感谢文章的链接。
【解决方案2】:

您要求做的事情一点也不简单。并且没有标准的方法来做到这一点 - 基本上你可以破解现有的实现,但不能保证该解决方案在未来能够正常工作。

我设法读取了一个事件的订阅者,这是项目的根 URL:http://www.codinghelmet.com/?path=net/sysexpand/reflection

您可以找到我在订阅者中迭代的起点是在此页面上查找 AddMonitoredObject 方法:http://www.codinghelmet.com/?path=net/sysexpand/reflection/source/dynevsubscr

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

【讨论】:

  • 谢谢,但这对我的需求来说似乎有点过头了。
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2011-02-05
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
相关资源
最近更新 更多