2010-01-05 18 views
14

Tengo esto como uno de mis miembros de la clase 'KeyEvent':Almacenamiento de un método como una variable miembro de una clase en C#

private delegate void eventmethod(); 

Y el constructor:

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

Lo que quiero hacer es en vez de llamar D() allí, quiero almacenar ese método (D) como una variable miembro de KeyEvent, así que algo como:

stored_method = D(); 

Y luego, en otro método de KeyEvent, haga algo como:

stored_method(); 

¿Cómo puedo hacer esto? Gracias

Respuesta

9

Ya tiene casi el código. Simplemente cree un campo de miembro del tipo de delegado correcto y guárdelo como lo haría con cualquier otro tipo de datos.

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

par de cosas ... todo tipo PascalCase/delegados/etc (EventMethod) y argumentos camelCase (d, dIsMyMethod). Y reutilizar lo que el marco que da: private Action hurr;

5

Se podría hacer algo como:

private Action CallBackFunction {get; set;} 

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

¿Qué se puede instanciar por:

new KeyEvent(MyFunction); 

Dónde MyFunction es el nombre de alguna función en esa clase

La clase KeyEvent puede invocar esa función con:

CallBackFunction(); 

La clase Acción también permite el paso de parámetros fuertemente tipados y la clase Func se puede usar para métodos que devuelven un resultado.

1

lo que desea que se llama "función de primera clase" http://en.wikipedia.org/wiki/First-class_function

C#, desde la versión 3, soporta funciones anónimas y expresiones lambda.

Así que usted puede utilizar Func<A,R> que representa una función de tomar un argumento de tipo A y devolver un valor de tipo R

de wiki

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