Хранение метода в качестве члена переменной класса в С#

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

private delegate void eventmethod();

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

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

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

stored_method = D();

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

stored_method();

Как я могу это сделать? Спасибо вам

Ответы

Ответ 1

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

private eventmethod MySavedEvent;

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

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

Ответ 2

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

private Action CallBackFunction {get; set;}

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

который может быть создан:

new KeyEvent(MyFunction);

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

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

CallBackFunction();

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

Ответ 3

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

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

Итак, вы можете использовать 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);
  }

Ответ 4

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;