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?

¿Fue útil?

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;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top