Хранение метода в качестве члена переменной класса в С#
У меня это как один из моих членов класса 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;