存储/传递代表作为变量(storing/passing delegates as variables

2019-08-01 09:38发布

我是相当新的C#,并正在对AA的方式,实行动态GUI至极采用串行通信。 我最初从C,所以函数指针的概念很熟悉。

Basicly我希望在serial命令已被处理调用answerFunction()函数。 从理论上说:我这是动态地在运行时创建的类lbl_txtBox_Pair。 我有一个类comObject与串行端口进行通信。 我有一个三等comPacket持有关于一个串行命令所有信息。

  1. 在类lbl_txtBox_Pair的对象我实例化一个数据包,并告诉它该功能,当串行命令完成应该叫。
  2. 我给包对象的实例comObject。
  3. beeing处理后的comObject想要通过调用存储在包对象委托以信号通知分组的原始发送者。

出于某种原因,我无法得到它的工作。 它告诉我,包的属性是不可调用的。 我做得不对teribly?

这里是代码:先在班“lbl_txtBox_Pair”的代码。 我在这里创建了comPacket,并把它交给comObject。

public delegate void answerHandler( comPacket packet);
public void txb_value_KeyPress(object sender, KeyPressEventArgs e)
{
   if (e.KeyChar == (char)Keys.Return)
   {
      answerHandler answerMethod = new answerHandler(this.processAnswer);
      comPacket question = new comPacket(this.command, answerMethod, 1);
      comObject.addPacket(question);
    }
 }

comPacket的构造。 在这里,代表被存储以便日后调用。

public Delegate answerFunction;
public comPacket(string cmd, Delegate func, int prio)
{
    this.cmd = cmd;
    answerFunction = func;
    this.prio = prio;
}

在comObject数据包得到处理。 完成后我想调用存储在数据包的功能。 该comObject运行在的方式在不同的线程。

if (this.isEndtocken(inputline))
 {
    listen = false;
    packet.answerFunction(packet);
 }

在这里,它是它打破。 packet.answerFunction(分组); 不会执行,并表示它不能被称为方法。

任何人都可以看到它错在何处? 我觉得好像委托失去它是代表什么的信息。 ;)或者,我必须完全地重新调整使用其他类型的回调/事件方法的代码?

Answer 1:

更改comPacket采取一个强类型的代表:

public answerHandler answerFunction;
public comPacket(string cmd, answerHandler func, int prio)
{
    this.cmd = cmd;
    answerFunction = func;
    this.prio = prio;
}

如果你仍想保留委托引用弱类型,您可以利用DynamicInvoke改为: http://msdn.microsoft.com/en-us/library/system.delegate.dynamicinvoke.aspx

编辑:如果你想保持强类型的代表尚未有不同的用途另一种选择是利用仿制药。 您的委托可以被安置在一个通用类,并针对通用类型的联结其签名。



Answer 2:

我不能发表评论,所以我必须张贴此作为一个答案,而不是。 代表们(和事件之类的东西),通常只能由包含它们的对象“调用”。

所以,如果你有

class MyClass {
    public event Action someEvent;
    // you can also replace Action with the name of your delegate type
}

你尝试做

MyClass x = new MyClass();
x.someEvent.Invoke();

那么这是一个错误。 如果你想其它对象能够调用的情况下,你必须做添加到方法MyClass这样的:

public void InvokeMyEvent() {
    someEvent.Invoke();
}

(我忘了,你是否仍然要为静态事件做到这一点)



文章来源: storing/passing delegates as variables