Хранение метода как переменной-члена класса - PullRequest
15 голосов
/ 05 января 2010

У меня есть один из моих членов класса 'KeyEvent':

private delegate void eventmethod();

И конструктор:

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

То, что я хочу сделать, это вместо вызова D (), я хочу сохранить этот метод (D) как переменную-член KeyEvent, так что-то вроде:

stored_method = D();

А потом в другом методе KeyEvent сделайте что-то вроде:

stored_method();

Как я могу это сделать?

Ответы [ 4 ]

10 голосов
/ 05 января 2010

У вас уже есть код. Просто создайте поле члена с правильным типом делегата и сохраните в нем параметр, как если бы вы использовали любой другой тип данных.

private eventmethod MySavedEvent;

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

public void CallSavedEvent() {
    if (MySavedEvent != null) {
        MySavedEvent();
    }
}
5 голосов
/ 05 января 2010

Вы можете сделать что-то вроде:

private Action CallBackFunction {get; set;}

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

Что может быть создано:

new KeyEvent(MyFunction);

Где MyFunction - имя некоторой функции в этом классе

Класс KeyEvent может затем вызвать эту функцию с помощью:

CallBackFunction();

Класс Action также позволяет передавать строго типизированные параметры, а класс Func можно использовать для методов, возвращающих результат.

1 голос
/ 05 января 2010

вещь, которую вы хотите, называется "функцией первого класса" http://en.wikipedia.org/wiki/First-class_function

C #, начиная с версии 3, поддерживает анонимные функции и лямбда-выражения.

Таким образом, вы можете использовать Func<A,R>, который представляет функцию, принимающую аргумент типа A и возвращающую значение типа R

из вики

static Func<double, double> MakeDerivative(Func<double, double> f, double deltaX)
  {
    return (x) => (f(x + deltaX) - f(x - deltaX)) / (2 * deltaX);
  }
0 голосов
/ 05 января 2010
public class KeyEvent
{
  private eventmethod hurr;
  public KeyEvent(eventmethod D)
  {
    hurr = D;
  }
  public void SomeOtherMethod()
  {
    hurr();
  }
}

Пара вещей ... Типы / делегаты PascalCase / etc (EventMethod) и аргументы camelCase (d, dIsMyMethod). И снова используйте то, что дает вам фреймворк: private Action hurr;

...