[英]Wiring and unwiring events in C# with arguments
i am trying to make use of events in C#. 我试图利用C#中的事件。 I am really new to events. 我真的很陌生。 Following is my code. 以下是我的代码。
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;
}
It gives me following error on the line where i am unwiring it. 它在我取消连线的线上给了我以下错误。 No overload for 'mysys_ValueChanged' matches delegate 'System.EventHandler' 'mysys_ValueChanged'的重载不匹配委托'System.EventHandler'
I will appreciate if somebody can help me out. 如果有人可以帮助我,我将不胜感激。
Thanks Tom 谢谢汤姆
Instead of sending name
as a seperate parameter, create a new class deriving from EventArgs
and add name
parameter to this class as a property. 不用发送name
作为单独的参数,而是创建一个从EventArgs
派生的新类,并将name
参数作为属性添加到此类。 Something like; 就像是;
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"));
Also do not forget to change the signiture of mysys_ValueChanged
. 同样不要忘记更改mysys_ValueChanged
的签名。
Note that this is just a workaround, and proper way is defining a new delegate which uses MyEventArgs
and using a seperate handling method instead of an inline method. 请注意,这只是一个解决方法,正确的方法是定义一个新的委托,该委托使用MyEventArgs
并使用单独的处理方法而不是内联方法。
The problem is that you haven't register mysys_ValueChanged
. 问题在于您尚未注册mysys_ValueChanged
。 You registered an anonymous method. 您注册了一个匿名方法。
You have to change your code to: 您必须将代码更改为:
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.
}
EDIT 编辑
Having new input it could be solved that way: 有了新的输入,就可以这样解决:
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.
}
I haven't tried it but I think this could work - but in my opinion it's hacked. 我没有尝试过,但是我认为这可以解决问题-但在我看来,它已被黑客入侵。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.