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

C# 查找注册到事件的委托方法,c#,reflection,delegates,C#,Reflection,Delegates,假设我有一个事件订阅,例如 _vm.PropertyChanged += OnViewModelAmountChanged; 如何通过反射看到方法名,就像在调试器中看到它一样?在我决定我可能在暮色地带之前,我一直走到了下面的那条线 ?vm.GetType().GetEvent("PropertyChanged").EventHandlerType.GetMethod("GetInvocationList") 有人能把我带回地球吗?这也可以通过表达式实现吗 干杯, Berryl一个.Net事件

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

_vm.PropertyChanged += OnViewModelAmountChanged;
如何通过反射看到方法名,就像在调试器中看到它一样?在我决定我可能在暮色地带之前,我一直走到了下面的那条线

?vm.GetType().GetEvent("PropertyChanged").EventHandlerType.GetMethod("GetInvocationList")
有人能把我带回地球吗?这也可以通过表达式实现吗

干杯,

Berryl

一个.Net事件只是一对名为
add\u Whatever
remove\u Whatever
的方法。他们不保证会得到field的支持

当您编写
事件事件处理程序时
在C#中,它将自动生成一个与事件同名的私有字段,以及设置该字段的
add
remove
访问器

您可以在运行时通过使用反射来获取private字段的值,然后调用
委托
类的public方法(无反射)来检查这些属性


对于非简单事件,包括所有WinForms事件,此方法将不起作用。

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

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

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

回答得很好。我打算建议查找编译器生成的字段,但我完全忘记了Windows窗体控件使用的“事件字典”模式。我想知道为什么EventInfo有一个GetRaiseMethod?它似乎不可能提供一个。你能为反射位划出一些代码吗?我想你是说我应该能够使用“vm.GetType().GetField(“PropertyChanged”,System.Reflection.BindingFlags.NonPublic)”找到一个字段,但它返回null,我现在看到了。我必须先去基本类型。谢谢这包括在: