Хранение метода как членская переменная класса

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

private delegate void eventmethod();

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

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

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

stored_method = D();

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

stored_method();

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

15
задан Uwe Keim 15 October 2018 в 07:02
поделиться

4 ответа

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

private eventmethod MySavedEvent;

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

public void CallSavedEvent() {
    if (MySavedEvent != null) {
        MySavedEvent();
    }
}
10
ответ дан 1 December 2019 в 04:09
поделиться
public class KeyEvent
{
  private eventmethod hurr;
  public KeyEvent(eventmethod D)
  {
    hurr = D;
  }
  public void SomeOtherMethod()
  {
    hurr();
  }
}

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

0
ответ дан 1 December 2019 в 04:09
поделиться
[

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

] [

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

] [

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

] [

]из вики[

] [
static Func<double, double> MakeDerivative(Func<double, double> f, double deltaX)
  {
    return (x) => (f(x + deltaX) - f(x - deltaX)) / (2 * deltaX);
  }
]
2
ответ дан 1 December 2019 в 04:09
поделиться

Можно сделать что-то вроде:

private Action CallBackFunction {get; set;}

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

Что может быть конкретизировано следующим образом:

new KeyEvent(MyFunction);

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

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

CallBackFunction();

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

5
ответ дан 1 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: