【问题标题】:How can I get a list of the underlying delegates from an event using reflection?如何使用反射从事件中获取底层委托的列表?
【发布时间】:2019-08-21 18:20:37
【问题描述】:

首先,GetInvocationList() 不起作用,因为我希望能够从课堂外找到他们。我认为它与一些反射魔法一起工作,这就是我想要弄清楚的。

这是我现在拥有的:

fooEventDispatcher.GetType().GetField("FooEvent", BindingFlags.Instance | BindingFlags.NonPublic);
var field = fieldInfo.GetValue(fooEventDispatcher);

我只是不知道如何处理field。有什么想法吗?

【问题讨论】:

  • 您能告诉我们查看调用列表的目的是什么吗?根据目的,可能有比反射更简单的方法来获得您想要的结果。
  • @Joel:我想对一个对象正在订阅一个事件进行单元测试。测试调用的副作用并不是一个干净的解决方案。
  • 为什么 GetInvocationList() 不起作用?这是一个公共方法,任何来自外部的人都可以调用该方法,除非您的类在程序集内部。
  • @ferosekhanj:你不能使用这样的事件。在课堂之外你唯一能做的就是+=-=
  • 对不起,我误解了我在考虑公共代表而不是事件的问题。

标签: c# reflection


【解决方案1】:

这应该可行:

var fieldInfo = fooEventDispatcher.GetType().GetField(
                "FooEvent", BindingFlags.Instance | BindingFlags.NonPublic);
var eventDelegate = fieldInfo.GetValue(fooEventDispatcher) as MulticastDelegate;
if (eventDelegate != null) // will be null if no subscribed event consumers
{
   var delegates = eventDelegate.GetInvocationList();
}

如果类型在编译时已经知道(我假设是),你应该使用typeof(SomeFooClass) 而不是fooEventDispatcher.GetType()

【讨论】:

  • 第4行应该是MulticastDelegate eventDelegate = (MulticastDelegate)field;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多