15

我将此作为“KeyEvent”类的成员之一:

private delegate void eventmethod();

和构造函数:

public KeyEvent(eventmethod D) 
{
    D();
}

我想要做的不是在那里调用 D(),而是将该方法 (D) 存储为 KeyEvent 的成员变量,例如:

stored_method = D();

然后稍后在 KeyEvent 的另一个方法中,执行以下操作:

stored_method();

我怎样才能做到这一点?

4

4 回答 4

11

你几乎已经有了代码。只需创建正确委托类型的成员字段并将参数保存到其中,就像使用任何其他数据类型一样。

private eventmethod MySavedEvent;

public void KeyEvent(eventmethod D) {
    // Save the delegate
    MySavedEvent = D;
}

public void CallSavedEvent() {
    if (MySavedEvent != null) {
        MySavedEvent();
    }
}
于 2010-01-05T19:08:35.987 回答
5

您可以执行以下操作:

private Action CallBackFunction {get; set;}

public KeyEvent(Action callback) {
   CallBackFunction = callback;
}

可以通过以下方式实例化:

new KeyEvent(MyFunction);

其中 MyFunction 是该类中某个函数的名称

然后 KeyEvent 类可以调用该函数:

CallBackFunction();

Action 类还允许传入强类型参数,Func 类可用于返回结果的方法。

于 2010-01-05T19:14:01.463 回答
2

你想要的东西叫做“一流的功能” http://en.wikipedia.org/wiki/First-class_function

C#,从版本 3 开始,支持匿名函数和 lambda 表达式。

因此,您可以使用Func<A,R>which 表示一个函数,该函数采用 A 类型的参数并返回 R 类型的值

来自维基

static Func<double, double> MakeDerivative(Func<double, double> f, double deltaX)
  {
    return (x) => (f(x + deltaX) - f(x - deltaX)) / (2 * deltaX);
  }
于 2010-01-05T19:15:25.017 回答
0
public class KeyEvent
{
  private eventmethod hurr;
  public KeyEvent(eventmethod D)
  {
    hurr = D;
  }
  public void SomeOtherMethod()
  {
    hurr();
  }
}

几件事...... PascalCase 类型/代表/等(EventMethod)和 camelCase 参数(d,dIsMyMethod)。并重用框架为您提供的内容: private Action hurr;

于 2010-01-05T19:09:19.587 回答