通过反射获取 public 静态事件的 GetInvocationList
Get GetInvocationList of a public static event via reflection
我有一个 class,其中包含 public 静态事件,我需要查明它是否附加了处理程序。我知道我可以使用 GetInvocationList() (如果事件不是静态的,那么我可以通过 GetField() 方法找到它)但问题是事件是静态的,我似乎无法通过使用反射来获取值。
public class Business
{
public static event EventHandler MyEvent;
}
我需要从另一个 class:
获取此事件的事件处理程序
public class MyClass
{
public void Test()
{
FieldInfo fieldInfo = typeof(Business).GetField("MyEvent", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
// fieldInfo is null!!
Delegate del = (Delegate)fieldInfo.GetValue(null);
var list = del.GetInvocationList();
}
}
我无法让 fieldInfo 返回值而不是 null!
因为 Business
是你自己的 class 使用反射似乎没有必要,这就是为什么我建议只做一个简单的方法来获取所需信息的原因。
例如
public class Program
{
public static void Main()
{
Business.MyEvent += MyFancyEventListener;
var xyz = Business.MyEventsInvocationList();
foreach (var x in xyz)
Console.WriteLine(x);
}
private static void MyFancyEventListener(object sender, EventArgs args)
{
}
}
public class Business
{
public static event EventHandler MyEvent;
//add this method to your class
public static IEnumerable<Delegate> MyEventsInvocationList() => MyEvent.GetInvocationList();
}
我有一个 class,其中包含 public 静态事件,我需要查明它是否附加了处理程序。我知道我可以使用 GetInvocationList() (如果事件不是静态的,那么我可以通过 GetField() 方法找到它)但问题是事件是静态的,我似乎无法通过使用反射来获取值。
public class Business
{
public static event EventHandler MyEvent;
}
我需要从另一个 class:
获取此事件的事件处理程序public class MyClass
{
public void Test()
{
FieldInfo fieldInfo = typeof(Business).GetField("MyEvent", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
// fieldInfo is null!!
Delegate del = (Delegate)fieldInfo.GetValue(null);
var list = del.GetInvocationList();
}
}
我无法让 fieldInfo 返回值而不是 null!
因为 Business
是你自己的 class 使用反射似乎没有必要,这就是为什么我建议只做一个简单的方法来获取所需信息的原因。
例如
public class Program
{
public static void Main()
{
Business.MyEvent += MyFancyEventListener;
var xyz = Business.MyEventsInvocationList();
foreach (var x in xyz)
Console.WriteLine(x);
}
private static void MyFancyEventListener(object sender, EventArgs args)
{
}
}
public class Business
{
public static event EventHandler MyEvent;
//add this method to your class
public static IEnumerable<Delegate> MyEventsInvocationList() => MyEvent.GetInvocationList();
}