查找注册到事件的委托方法

时间:2010-02-28 05:00:40

标签: c# reflection delegates

假设我有一个事件订阅,例如

_vm.PropertyChanged += OnViewModelAmountChanged;

如何通过反射以及在调试器中看到它的方式来查看方法名称?在我决定进入暮光之城之前,我已经到了下面一行

?vm.GetType().GetEvent("PropertyChanged").EventHandlerType.GetMethod("GetInvocationList")

有人能让我回到地球吗?这也可以通过表达式完成吗?

干杯,
Berryl

3 个答案:

答案 0 :(得分:1)

<。> .Net事件只是一对名为add_Whateverremove_Whatever的方法。它们不能保证得到现场支持。

当您在C#中编写event EventHandler Whatever;时,它会自动生成一个与该事件同名的私有字段,以及设置该字段的addremove个访问者。

您可以在运行时通过使用Reflection来获取私有字段的值来检查这些值,然后调用Delegate类的公共GetInvocationList方法(不带反射)。

对于非简单事件,包括所有WinForms事件,此方法将无效。

答案 1 :(得分:1)

要记住的一件事是,事件可以自定义事件的添加/删除方法。在这种情况下,包含类可以将委托放入任何数据结构(例如List)或甚至忽略它(尽管这不太可能)。重要的是,代表可以按照班级喜欢的方式存储。这就像试图找到用于存储Property的值的字段。

答案 2 :(得分:1)

如果您在声明该事件的类中,您可以执行以下操作:

foreach(Delegate d in MyEvent.GetInvocationList())
{
    Console.WriteLine(d.Method.Name);
}