使用参数在C#中连接和取消连接事件

时间:2015-07-01 12:27:39

标签: c# events

我正在尝试利用C#中的事件。我对事件真的很陌生。以下是我的代码。

     public void GetVoltage(Object objName, Object objCcaVar)
{
  DynamicSystemVariable mysys = new DynamicSystemVariable("VTS::M9_Ch3", "AvgVoltage");
  mysys.ValueChanged += (sender, e) => mysys_ValueChanged(sender, e, ""); ;

}


void mysys_ValueChanged(object sender, EventArgs e,String name)
{       
    DynamicSystemVariable mysys = (DynamicSystemVariable)sender;
    Output.WriteLine(mysys.GetValue().ToString());
    Output.WriteLine("System Variable Changed");
    if (_unwireEvent)
        mysys.ValueChanged -= mysys_ValueChanged;
}

它让我在线路上出现以下错误,我将其解除连线。 'mysys_ValueChanged'没有重载匹配委托'System.EventHandler'

如果有人可以帮助我,我将不胜感激。

由于 汤姆

2 个答案:

答案 0 :(得分:2)

不是将name作为单独的参数发送,而是创建一个派生自EventArgs的新类,并将name参数作为属性添加到此类中。喜欢的东西;

public class MyEventArgs : EventArgs
{
    public string Name {get; private set;}
    public MyEventArgs(EventArg e, string name)
    {
        this.Name = name;
    }
}

mysys.ValueChanged += mysys_ValueChanged(sender, new MyEventArgs("some name"));

另请不要忘记更改mysys_ValueChanged的签名。

请注意,这只是一种解决方法,正确的方法是定义一个新委托,该委托使用MyEventArgs并使用单独的处理方法而不是内联方法。

答案 1 :(得分:0)

问题在于您没有注册mysys_ValueChanged。您注册了匿名方法。

您必须将代码更改为:

public void GetVoltage(Object objName, Object objCcaVar)
{
  DynamicSystemVariable mysys = new DynamicSystemVariable("VTS::M9_Ch3", "AvgVoltage");
  mysys.ValueChanged += this.OnEvent;

}

private void OnEvent(object sender, EventArgs e)
{
  mysys_ValueChanged(sender, e, "");
}

void mysys_ValueChanged(object sender, EventArgs e,String name)
{       
    DynamicSystemVariable mysys = (DynamicSystemVariable)sender;
    Output.WriteLine(mysys.GetValue().ToString());
    Output.WriteLine("System Variable Changed");
    if (_unwireEvent)
        mysys.ValueChanged -= OnEvent;  // Unregister what you've registered.
}

修改

有了新的输入,就可以通过这种方式解决:

public void GetVoltage(Object objName, Object objCcaVar)
{
  DynamicSystemVariable mysys = new DynamicSystemVariable("VTS::M9_Ch3", "AvgVoltage");

  EventHandler<EventArgs> handler = null;
  handler = (s, e) => mysys_ValueChanged(s, e, "", handler);

  mysys.ValueChanged += handler;   
}

void mysys_ValueChanged(object sender, EventArgs e, String name, EventHandler<EventArgs> handler)
{       
    DynamicSystemVariable mysys = (DynamicSystemVariable)sender;
    Output.WriteLine(mysys.GetValue().ToString());
    Output.WriteLine("System Variable Changed");
    if (_unwireEvent)
        mysys.ValueChanged -= handler;  // Unregister what you've registered.
}

我没有尝试过,但我认为这可行 - 但在我看来,它被黑了。