2012-03-27 17 views
5

Tengo una clase que ejemplifica dos clases que implementan interfaces. Quiero que una clase notifique a otra clase que algo está bien. Podría hacerlo con una Acción y luego usar variables privadas en la clase, pero me pregunté si habría una manera directa de hacerlo con las propiedades para que cuando el valor de una propiedad cambie actualice una propiedad en otra clase.Acción <T> equivalente para las propiedades

Por ejemplo:

public class MyClass 
{ 
    public ILogger Logger {get;set;} 
    public ILogic Logic {get;set;} 

    private Form MyWinform; 

    public void Setup() 
    { 
    MyWinform = new MyWinform(); 
    MyWinform.StartBatch += Logger.CreateFile; //Create file when user presses start 

    //How can I set a property on ILogic to be AllOk once ILogger says so?? 

    //I could use an Action so that once all is ok I call IDecidedAlOK in ILogger which 
    //can then assign a private bool variable inside the class 

    Logic.ItsOKMethodSoSetVariableToTrue = Logger.IDecidedAllOKMethod; 

    } 

    public void DataIn(string Value) 
    { 
    Logic.DataIn(Value); 
    } 

    public void CreateInstances() 
    { 
    Logger = new FileLogger(); 
    Logic = new MyLogic(); 
    } 

} 

public class MyLogic : ILogic 
{ 
    public void DataIn(string Value) 
    { 
    //I want to check that all is ok before I do anything 

    //if (!AllOK) 
    //return; 

    //Do stuff 
    } 
} 
+0

Tienes la clase ILogger, quiero decir, ¿puedes hacer cambios en ella? – Stormenet

+1

¿Puede 'ILogger' exponer un evento' AllOK' al que 'ILogic' puede suscribirse? – mellamokb

+0

@Stormenet Sí puedo – Jon

Respuesta

3

Implementar INotifyPropertyChanged interfaz y suscribirse a PropertyChanged caso

+0

Estaba tratando de evitar esto, pero parece ser un enfoque popular. Creo que iré con un evento personalizado, aunque – Jon

0

me siento como que podría ser un poco más convencional que su interfaz ILogger exponer algo así como un "FileCreated" o " Listo ", y permita que su aplicación maneje ese evento para actualizar el objeto de ILogic (o haga lo que sea necesario).

EDIT: disculpe, después de volver a leer la pregunta, creo que entendí mal lo que estaba pidiendo.

No hay ningún objeto "natural" que hace exactamente lo que estás pidiendo, pero se podría crear un delegado anónimo (o expresión lambda) para este propósito:

Action<bool> loggerResult = (value) => Logic.ItsOKMethodSoSetVariableToTrue = value; 
0

Una propiedad consta internamente de dos métodos privados, un get_XXX y un set_XXX, de modo que a menos que desee obtener el MethodInfo de esos métodos e invocarlos (que son nuevamente métodos) no tiene más remedio que implementar un método de invocación de métodos.

0

Suscribirse al evento (INotifyPropertyChanged o alguno personalizado) es correcto, también lo es el método para pasar un lambda-setter, pero en algunos casos puede ser más conveniente usar un objeto de contexto compartido (muy parecido al concepto de memoria compartida)):

class ConversationContext 
{ 
    public bool EverythingIsOK { get; set;} 
} 

Este objeto se pasa a todos los objetos interesados ​​(ILogic y ILogger) y que operan directamente sobre ella, en lugar de algunas propiedades internas. Si se requieren notificaciones de cambio, implemente INotifyPropertyChanged en él.

Un aspecto positivo de este enfoque es que no se enredará en disparos repetidos de eventos que desencadenen otros eventos, etc. Un solo objeto mantendrá el estado actual y no se necesitan actualizaciones periódicas.

De nuevo, esta es solo una de las muchas opciones.

Cuestiones relacionadas