C# 有没有办法重构将事件附加到单独的静态方法?

C# 有没有办法重构将事件附加到单独的静态方法?,c#,event-handling,dry,argument-passing,func,C#,Event Handling,Dry,Argument Passing,Func,我将把表单的一个控件传递给另一个类,在那里我将为该控件、其父控件等创建事件。我还需要在某个时候分离这些事件。但是如果活动已经附加,我需要确保我不会重复活动 所以我总是附加这样的事件,例如: internal static void X(Control c, MouseEventHandler mouseDownEvent) { c.TopLevelControl.MouseDown -= mouseDownEvent; c.TopLevelControl.MouseDown +=

我将把表单的一个控件传递给另一个类,在那里我将为该控件、其父控件等创建事件。我还需要在某个时候分离这些事件。但是如果活动已经附加,我需要确保我不会重复活动

所以我总是附加这样的事件,例如:

internal static void X(Control c, MouseEventHandler mouseDownEvent)
{
    c.TopLevelControl.MouseDown -= mouseDownEvent;
    c.TopLevelControl.MouseDown += mouseDownEvent;
}
现在,我还需要为其他处理程序附加类似的事件。例如

internal static void X(Control c, EventHandler event)
{
    c.Enter -= event;
    c.Enter += event;
}
现在我不想把这个
-=
+=
到处乱扔,而是希望有一个简单的实用函数,这样我可以在任何地方调用它

比如:

internal static void AttachEvent(this Control c, 
                                 Func<Control, MouseEventHandler> e, 
                                 MouseEventHandler m)
{
    e(c) -= m;
    e(c) += m;
}
但这无法编译,我有两个错误:

事件“System.Windows.Forms.Control.MouseDown”只能出现在+=或-=的左侧。

赋值的左侧必须是变量、属性或索引器


我想让
附件事件
将任何事件作为输入参数,但如果太复杂,我可以单独使用MouseEvents。

我认为这是不可能的。C#中的事件-与属性类似-由两个方法组成:添加和删除。所以,若你们在脑海中用两种方法展开这个事件

e.add_MouseOver(Delegate)
e.remove_MouseOver(Delegate) 
您将看到,传递对事件的引用并用其他方法处理它是不可能的


另外+=也是C#语法的一部分,仅适用于表达式左侧的引用事件。

为什么要删除处理程序,以便在删除后立即再次添加它?@zeebok删除现有处理程序(以避免重复)。如果我不删除,一个事件可能会有更多的处理程序多次执行相同的tak
e.add_MouseOver(Delegate)
e.remove_MouseOver(Delegate)