有没有办法重构事件到一个单独的静态方法?

时间:2012-09-22 10:23:11

标签: c# event-handling dry argument-passing func

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

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

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;
}

所以我可以致电:

AttachEvent(c, control => control.MouseDown, mouseDownEvent);

但这不会编译,我得到两个错误:

The event 'System.Windows.Forms.Control.MouseDown' can only appear on the left hand side of += or -=

The left-hand side of an assignment must be a variable, property or indexer

我希望AttachEvent将任何事件作为输入参数,但如果这太复杂,我可以单独使用MouseEvents。

1 个答案:

答案 0 :(得分:1)

我认为这是不可能的。 C#中的事件 - 就像属性一样 - 由两个方法组成:添加和删除。因此,如果您在脑海中用两种方法扩展事件

e.add_MouseOver(Delegate)
e.remove_MouseOver(Delegate) 

您将看到无法传递对事件的引用并在其他方法中执行某些操作。

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