如何删除关闭事件?

How to remove Closing event?

我找到了一个很好的示例,说明如何从表单中删除所有 Click 事件:

private void RemoveClickEvent(Form c)
{
    var f1 = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
    var obj = f1.GetValue(c);
    var pi = c.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
    var list = (EventHandlerList)pi.GetValue(c, null);
    list.RemoveHandler(obj, list[obj]);
}

而且效果很好。但是,我需要的是删除 Closing 事件,但我不知道要写什么而不是 EventClick 才能使其正常工作。我试着写 EventClosingClosing,但没有用。因此我的问题是:应该改变什么才能让它工作? 甚至更好 - 我想找到 所有可能输入的列表 因为我可能需要删除其他事件,例如 ClosedFormClosingFormClosed

P.S。一个简单的 -= 是不可能的,因为可能会附加许多事件,其中许多事件我根本无法访问,因此我无论如何都无法删除它们。

如评论中所述,我列出了这些事件名称:

typeof(Form).GetFields(BindingFlags.NonPublic | BindingFlags.Static).AsEnumerable().ToList();

现在我有一个看起来像这样的方法:

public static class Utils
{
    public static void DisableEvents<T>(this T ctrl, string officialName, string simplifiedName) where T : Control
    {
        var propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
        var eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList;
        var fieldInfo = typeof(T).GetField(officialName, BindingFlags.NonPublic | BindingFlags.Static);
        var eventKey = fieldInfo.GetValue(ctrl);
        var eventHandler = eventHandlerList[eventKey];
        var invocationList = eventHandler.GetInvocationList();

        foreach (var item in invocationList)
        {
            ctrl.GetType().GetEvent(simplifiedName).RemoveEventHandler(ctrl, item);
        }
    }
}

用法如下:

myForm.DisableEvents<Form>("EVENT_CLOSING", "Closing");

不幸的是,我还没有想出一种方法来将单个参数传递给我的方法。

根据前面的post,用法必须是这样的:

        myForm.DisableEvents<Form>("EVENT_FORMCLOSING", "FormClosing");
        myForm.DisableEvents<Form>("EVENT_FORMCLOSED", "FormClosed");