2010-01-05 20 views
14

ich dies meiner Mitglieder der Klasse als eine haben ‚KeyEvent‘:eine Methode als eine Membervariable einer Klasse in C# Speichern

private delegate void eventmethod(); 

Und Konstruktor:

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

Was ich tun möchten, ist stattdessen D() gibt der Aufruf, ich das Verfahren (D) als Mitglied Variable KeyEvent, so etwas wie speichern wollen:

stored_method = D(); 

Und dann später in einer anderen Methode von KeyEvent, tun Sie etwas wie:

Wie kann ich das tun? Danke

Antwort

9

Sie haben ziemlich genau den Code bereits. Erstellen Sie einfach ein Mitgliedsfeld des richtigen Delegattyps und speichern Sie den Parameter wie bei jedem anderen Datentyp.

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

Paar Dinge ... Pascal Arten/Delegierten/etc (BeiEreignis) und camelcase Argumente (d, dIsMyMethod). Und wieder verwenden, was der Rahmen gibt Ihnen: private Action hurr;

5

könnten Sie so etwas wie:

private Action CallBackFunction {get; set;} 

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

die durch instanziiert werden kann:

new KeyEvent(MyFunction); 

Wo MyFunction die Namen in dieser Klasse von irgendeiner Funktion ist

Die KeyEvent-Klasse kann diese Funktion dann aufrufen mit:

CallBackFunction(); 

Die Action-Klasse ermöglicht auch die Eingabe von stark typisierten Parametern, und die Func-Klasse kann für Methoden verwendet werden, die ein Ergebnis zurückgeben.

1

die Sache, die Sie ist "First-Class-Funktion" http://en.wikipedia.org/wiki/First-class_function

C#, seit Version 3 unterstützt anonyme Funktionen und Lambda-Ausdrücke genannt werden soll.

So können Sie Func<A,R> verwenden, die eine Funktion stellt ein Argument vom Typ A zu nehmen und einen Wert vom Typ R

aus dem Wiki Rückkehr

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