如果您真的需要手动调用事件,您可以获取支持委托,该委托通常是私有的。使用 .NET 反编译器(如 ILSPY)定位 Event 的支持字段,然后使用反射获取支持委托。
示例:从BackgroundWorker 获取事件DoWork:
在ILSpy中反编译BackgroundWorker类,你会看到:
public event DoWorkEventHandler DoWork
{
add
{
base.Events.AddHandler(doWorkKey, value);
}
remove
{
base.Events.RemoveHandler(doWorkKey, value);
}
}
所以你需要找到Events 成员,以及doWorkKey 字段作为键。
Events 是在 Component 类中声明的 EventHandlerList(公共类)。
doWorkKey 是类BackgroundWorker 中声明的静态字段。
然后使用反射获取委托:
PropertyInfo property = backgroundWorker.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
EventHandlerList eventHandlerList = (EventHandlerList)property.GetValue(backgroundWorker, null);
FieldInfo doWorkField = backgroundWorker.GetType().GetField("doWorkKey", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy);
object doWorkKey = doWorkField.GetValue(null);
DoWorkEventHandler doWork = (DoWorkEventHandler)eventHandlerList[doWorkKey];
现在您有了DoWork 事件的委托,并且可以调用它。
同样的方法也适用于其他控件。
请注意,只要有新版本的代码,使用反射获取私有字段可能会中断。