2012-03-27 1 views
5

Ich habe eine Klasse, die zwei Klassen instanziiert, die Schnittstellen implementieren. Ich möchte, dass eine Klasse eine andere Klasse benachrichtigt, dass etwas in Ordnung ist. Ich könnte es mit einer Aktion machen und dann private Variablen in der Klasse verwenden, frage mich aber, ob es eine direkte Möglichkeit gibt, dies mit Eigenschaften zu tun, so dass sich eine Eigenschaft einer anderen Klasse aktualisiert, wenn sich der Wert einer Eigenschaft ändert.Aktion <T> entspricht für Eigenschaften

Zum Beispiel:

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

Besitzen Sie die ILogger-Klasse, ich meine, können Sie Änderungen daran vornehmen? – Stormenet

+1

Kann "ILogger" ein "AllOK" -Ereignis offen legen, das "ILogic" abonnieren kann? – mellamokb

+0

@Stormenet Ja ich kann – Jon

Antwort

3

Implementieren INotifyPropertyChanged Schnittstelle und abonnieren Sie PropertyChanged Ereignis

+0

Ich versuchte, dies zu vermeiden, aber scheint ein beliebter Ansatz zu sein. Ich denke, ich werde mit einer benutzerdefinierten Veranstaltung gehen – Jon

0

Ich fühle mich wie es vielleicht ein bisschen mehr konventionelle Ihre ILogger Schnittstelle zu haben, so etwas wie ein „FileCreated“ aussetzen oder " Ready "-Ereignis, und erlauben Sie Ihrer Anwendung, dieses Ereignis zu behandeln, um das ILogic-Objekt zu aktualisieren (oder was auch immer notwendig ist).

EDIT: Ich entschuldige mich, nachdem ich die Frage erneut gelesen habe, ich glaube, ich habe missverstanden, was Sie verlangten.

Es gibt keine „natürlichen“ Objekt, das tut genau das, was Sie fragen, aber man konnte einen anonymen Delegierten (oder Lambda-Ausdruck) für diesen Zweck erstellen:

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

Eine Eigenschaft intern besteht aus zwei private Methoden, eine get_XXX und eine set_XXX. Wenn Sie also nicht die MethodInfo dieser Methoden abrufen und diese aufrufen möchten (was wiederum Methoden sind), haben Sie keine andere Wahl, als eine Methodenaufrufmethode zu implementieren.

0

Die Anmeldung bei Ereignis (INotifyPropertyChanged oder einer benutzerdefinierten) ist in Ordnung, also ist die Methode ein Lambda-Setter zu übergeben, aber in einigen Fällen ist es einfacher, ein gemeinsames Kontextobjekt zu verwenden (ähnlich dem Shared Memory-Konzept)):

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

Dieses Objekt an alle interessierten Objekte übergeben wird (ILogic und ILogger) und sie arbeiten direkt auf sie, statt einiger interner Eigenschaften. Wenn Änderungsbenachrichtigungen erforderlich sind, Implementieren Sie INotifyPropertyChanged darauf.

Ein positiver Aspekt dieses Ansatzes ist, dass Sie sich nicht in wiederholten Auslösen von Ereignissen verwickeln, die andere Ereignisse auslösen und so weiter. Ein einzelnes Objekt enthält den aktuellen Status, und es sind keine wiederholten Aktualisierungen erforderlich.

Auch dies ist nur eine von vielen Optionen.