Almacenamiento de un método como una variable miembro de una clase
Pregunta
Tengo esto como uno de mis miembros de la clase 'KeyEvent':
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 más tarde en otro método de KeyEvent, hacer algo como:
stored_method();
¿Cómo puedo hacer esto?
Solución
Más o menos, tiene el código ya. Basta con crear un campo miembro del tipo de delegado derecho y guardar el parámetro que al igual que 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();
}
}
Otros consejos
Se podría hacer algo como:
private Action CallBackFunction {get; set;}
public KeyEvent(Action callback) {
CallBackFunction = callback;
}
¿Qué puede ser instanciado por:
new KeyEvent(MyFunction);
Cuando MyFunction es el nombre de alguna función en esa clase
La clase KeyEvent entonces puede invocar esa función con:
CallBackFunction();
La clase de acción también permite que los parámetros inflexible de tipos que se pasa en y la clase Func se puede utilizar para métodos que devuelven un resultado.
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);
}
public class KeyEvent
{
private eventmethod hurr;
public KeyEvent(eventmethod D)
{
hurr = D;
}
public void SomeOtherMethod()
{
hurr();
}
}
Un par de cosas ... todo tipo PascalCase / delegados / etc (EventMethod) y argumentos camelCase (d, dIsMyMethod). Y reutilizar lo que el marco le da: private Action hurr;