2010-01-05 5 views
14

ho questo come uno dei miei membri della classe 'KeyEvent':Memorizzazione di un metodo come una variabile membro di una classe in C#

private delegate void eventmethod(); 

e il costruttore:

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

Quello che ho voglio fare è invece di chiamare D() c'è, voglio archiviare questo metodo (D) come variabile membro della KeyEvent, quindi qualcosa di simile:

stored_method = D(); 

E poi in un altro metodo di KeyEvent, fare qualcosa come:

stored_method(); 

Come posso fare questo? Grazie

risposta

9

Hai praticamente già il codice. È sufficiente creare un campo membro del tipo delegato corretto e salvarlo come se fosse un qualsiasi altro tipo di dati.

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(); 
    } 
} 

paio di cose ... tipi PascalCase/delegati/etc (EventMethod) e argomenti camelCase (d, dIsMyMethod). E riutilizzare ciò che il quadro che si dà: private Action hurr;

5

Si potrebbe fare qualcosa di simile:

private Action CallBackFunction {get; set;} 

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

Che può essere istanziato da:

new KeyEvent(MyFunction); 

Dove MyFunction è il nome di una qualche funzione in quella classe

La classe KeyEvent può quindi richiamare tale funzione con:

CallBackFunction(); 

La classe Action consente anche di passare i parametri fortemente tipizzati e la classe Func può essere utilizzata per i metodi che restituiscono un risultato.

1

la cosa che si desidera è chiamato "la funzione di prima classe" http://en.wikipedia.org/wiki/First-class_function

C#, a partire dalla versione 3, supporta funzioni anonime e le espressioni lambda.

Così si può utilizzare Func<A,R> che rappresenta una funzione di prendere un argomento di tipo A e restituire un valore di tipo R

da wiki

static Func<double, double> MakeDerivative(Func<double, double> f, double deltaX) 
    { 
    return (x) => (f(x + deltaX) - f(x - deltaX))/(2 * deltaX); 
    }