事件传递参数

时间:2015-11-18 15:16:06

标签: c# events

我遇到了事件的问题。例如,让我有事件  public event EventHandler<AxisChangedEventArgs> AxisChanged 当Axis平移或缩放或其他东西时会触发。当它开火时我正在制作Console.WriteLine("Working");。如何将CFDBOX参数传递给SomeWork匿名方法无济于事,因为取消订阅它是不可能的。我无法覆盖AxisChanged事件。

public void AddEvents(CFDBOX CFDBOX) {
    CFDBOX.PlotModel.Axes[0].AxisChanged += SomeWork;
}

public void RemoveEvents(CFDBOX CFDBOX) {
    CFDBOX.PlotModel.Axes[0].AxisChanged -= SomeWork;
}

public EventHandler<AxisChangedEventArgs> SomeWork =
    delegate(object o, AxisChangedEventArgs args) {
        Console.WriteLine("Working");
    }
;

2 个答案:

答案 0 :(得分:1)

利用closure lambda表达式:

private EventHandler<AxisChangedEventArgs> axisChangedEventHandler;

public void AddEvent(CFDBOX CFDBOX) {
    // keep a reference of the event handler to remove it later
    axisChangedEventHandler = (o, args) => {
        // parameter CFDBOX bound to the event handler
        Console.WriteLine("Working " + CFDBOX); 
    };
    // register event handler
    CFDBOX.PlotModel.Axes[0].AxisChanged += axisChangedEventHandler;
}

public void RemoveEvent() {
    // unregister event handler
    CFDBOX.PlotModel.Axes[0].AxisChanged -= axisChangedEventHandler;
}

答案 1 :(得分:0)

任何必须与event一起传递的参数都应该是EventArgs实施的成员。在您的方案中:AxisChangedEventArgs。希望我能得到你的问题。

事件的发件人(在您的情况下为o)应该始终是调用事件的实例。因此,如果您的事件被不同的类(而不是实例!)触发,您将必须检查o的类型。