2010-01-05 2 views
14

у меня есть это, как один из моих членов класса «KeyEvent»:Сохранение метода в качестве переменной-члена класса в C#

private delegate void eventmethod(); 

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

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

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

stored_method = D(); 

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

stored_method(); 

Как это сделать? Спасибо

ответ

9

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

private eventmethod MySavedEvent; 

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

public void CallSavedEvent() { 
    if (MySavedEvent != null) { 
     MySavedEvent(); 
    } 
} 
0
public class KeyEvent 
{ 
    private eventmethod hurr; 
    public KeyEvent(eventmethod D) 
    { 
    hurr = D; 
    } 
    public void SomeOtherMethod() 
    { 
    hurr(); 
    } 
} 

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

5

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

private Action CallBackFunction {get; set;} 

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

который может быть обработан с помощью:

new KeyEvent(MyFunction); 

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

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

CallBackFunction(); 

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

1

вещь, которую вы хотите, называется «первая функция класса» 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); 
    } 
Смежные вопросы