将方法存储为类的成员变量

时间:2010-01-05 19:03:12

标签: c# methods delegates member

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

private delegate void eventmethod();

构造函数:

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

我想做的不是在那里调用D(),我想将该方法(D)存储为KeyEvent的成员变量,所以类似于:

stored_method = D();

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

stored_method();

我该怎么做?

4 个答案:

答案 0 :(得分:10)

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

private eventmethod MySavedEvent;

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

public void CallSavedEvent() {
    if (MySavedEvent != null) {
        MySavedEvent();
    }
}

答案 1 :(得分:5)

您可以执行以下操作:

private Action CallBackFunction {get; set;}

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

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

new KeyEvent(MyFunction);

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

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

CallBackFunction();

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

答案 2 :(得分:1)

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

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

所以你可以使用Func<A,R>代表一个带有A类参数并返回R类型值的函数

来自wiki的

static Func<double, double> MakeDerivative(Func<double, double> f, double deltaX)
  {
    return (x) => (f(x + deltaX) - f(x - deltaX)) / (2 * deltaX);
  }

答案 3 :(得分: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;