通过反射获取事件参数

时间:2009-04-15 01:17:39

标签: c# vb.net reflection

我无法弄清楚如何获取事件的参数类型。

例如,我只能看到使用MethodInfo来获取参数,但我有一个EventInfo或FieldInfo。

我想要的是能够从中得到'布尔':

Public Event EventName(ByVal sender As Object, ByVal value As Boolean)

理论上我可以尝试类似GetRaiseMethod()的东西,但这不起作用(因为该方法按照this link返回null),即使它确实如此,也需要首先进行方法绑定,这意味着对于测试套件,只是确认事件在初始化时具有某个类型参数。

有什么想法吗?

2 个答案:

答案 0 :(得分:12)

假设事件EventName在类DeclaringClass中声明且事件至少包含参数,则可以获取第二个参数的类型,如下所示。否则你可能会收到一个例外。

Type secondEventHandlerParameterType = 
   typeof(DeclaringClass).
   GetEvent("EventName").
   EventHandlerType.
   GetMethod("Invoke").
   GetParameters()[1].
   ParameterType;

答案 1 :(得分:0)

我尝试使用Daniel解决方案,但在我的PCL中获得TypeInitializationException例外。

以下代码对我有用,看起来更清晰:

Type secondEventHandlerParameterType = 
   typeof(DeclaringClass).
   GetEvent("EventName").
   EventHandlerType.
   GenericTypeArguments.
   First();