如何将事件传递给C#中的函数?

str*_*ger 20 c# delegates

我希望将事件传递给辅助函数.此函数将附加方法到事件.但是,我无法正确传递活动.我试过传递一个EventHandler<TEventArgs>.它编译,但事件没有附加(但仍然添加;它似乎是事件处理程序的副本).

例如,如果我有这个:

public event EventHandler<EventArgs> MyEvent;
Run Code Online (Sandbox Code Playgroud)

和助手功能:

public static void MyHelperFunction<TEventArgs>(EventHandler<TEventArgs> eventToAttachTo)
{
    eventToAttachTo += (sender, e) => { Console.WriteLine("Hello world"); };
}
Run Code Online (Sandbox Code Playgroud)

和来电者:

MyHelperFunction(MyEvent);
MyEvent(null, new EventArgs()); // Does nothing.
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 17

这不起作用的原因是+ =当应用于委托时创建一个新委托,它是旧的和新的组合.它不会修改现有的委托.

为了使其工作,您将不得不通过引用传递委托.

public static void Helper(ref EventHandler<EventArgs> e)
{
    e+= (x,y) => {};
}
Run Code Online (Sandbox Code Playgroud)

这种方法在该方法之外工作的原因是因为LHS仍然是实际的领域.所以+ =将创建一个新的委托并分配回成员字段.

  • 使用ref的问题:如果我使用Helper(ref myClassInstance.MyEvent),我会收到以下错误:事件MyEvent只能出现在+ =或 - =的左侧(除非在MyClass类型中使用).我该如何解决这个问题? (4认同)