假设我有一个事件订阅,例如
_vm.PropertyChanged += OnViewModelAmountChanged;
如何通过反射以及在调试器中看到它的方式来查看方法名称?在我决定进入暮光之城之前,我已经到了下面一行
?vm.GetType().GetEvent("PropertyChanged").EventHandlerType.GetMethod("GetInvocationList")
有人能让我回到地球吗?这也可以通过表达式完成吗?
干杯,
Berryl
答案 0 :(得分:1)
add_Whatever
和remove_Whatever
的方法。它们不能保证得到现场支持。
当您在C#中编写event EventHandler Whatever;
时,它会自动生成一个与该事件同名的私有字段,以及设置该字段的add
和remove
个访问者。
您可以在运行时通过使用Reflection来获取私有字段的值来检查这些值,然后调用Delegate
类的公共GetInvocationList
方法(不带反射)。
对于非简单事件,包括所有WinForms事件,此方法将无效。
答案 1 :(得分:1)
要记住的一件事是,事件可以自定义事件的添加/删除方法。在这种情况下,包含类可以将委托放入任何数据结构(例如List)或甚至忽略它(尽管这不太可能)。重要的是,代表可以按照班级喜欢的方式存储。这就像试图找到用于存储Property的值的字段。
答案 2 :(得分:1)
如果您在声明该事件的类中,您可以执行以下操作:
foreach(Delegate d in MyEvent.GetInvocationList())
{
Console.WriteLine(d.Method.Name);
}