2012-03-27 8 views
5

Ho una classe che istanzia due classi che implementano le interfacce. Voglio che una classe comunichi ad un'altra classe che qualcosa è OK. Potrei farlo con un'azione e quindi utilizzare variabili private nella classe, ma mi chiedevo se esistesse un modo diretto per farlo con le proprietà in modo che quando il valore di una proprietà cambia, essa aggiorna una proprietà su un'altra classe.Azione <T> equivalente per le proprietà

Ad esempio:

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

Possiedi la classe di ILogger, voglio dire, puoi apportarvi delle modifiche? – Stormenet

+1

'ILogger' può esporre un evento' AllOK' a cui 'ILogic' può abbonarsi? – mellamokb

+0

@Stormenet Sì, posso – Jon

risposta

3

Implementare INotifyPropertyChanged interfaccia e sottoscrivere PropertyChanged evento

+0

stavo cercando di evitare questo, ma sembra essere un approccio popolare. Penso che andrò con un evento personalizzato però – Jon

0

mi sento come potrebbe essere un po 'più convenzionale di avere l'interfaccia ILogger esporre qualcosa come un "FileCreated" o " Pronto "e consente alla tua applicazione di gestire quell'evento per aggiornare l'oggetto ILogic (o fare qualsiasi altra cosa sia necessaria).

EDIT: mi scuso, dopo aver riletto la domanda, penso di aver frainteso quello che stavi chiedendo.

Non c'è nessun oggetto "naturale" che fa esattamente quello che stai chiedendo, ma si potrebbe creare un delegato anonimo (o l'espressione lambda) per questo scopo:

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

Una proprietà è composta internamente due metodi privati, un get_XXX e un set_XXX, quindi a meno che non si voglia recuperare il MethodInfo di quei metodi e invocarli (che sono di nuovo metodi) non si ha altra scelta che implementare un metodo di chiamata al metodo.

0

L'iscrizione all'evento (INotifyPropertyChanged o una personalizzata) è OK, così è il metodo per passare un lambda-setter, ma in alcuni casi potrebbe essere più conveniente utilizzare un oggetto contesto condiviso (proprio come il concetto di memoria condivisa):

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

Questo oggetto viene passato a tutti gli oggetti interessati (ILogic e ILogger) e operano direttamente su di essa, invece di alcune proprietà interne. Se sono necessarie notifiche di modifica, implementare INotifyPropertyChanged su di esso.

Un aspetto positivo di questo approccio è che non ti aggroverai negli eventi a ripetizione che attivano altri eventi e così via. Un singolo oggetto manterrà lo stato corrente e non sono necessari aggiornamenti periodici.

Ancora una volta, questa è solo una delle molte opzioni.

Problemi correlati