2012-03-27 37 views
5

我有一個類實例化兩個實現接口的類。我想讓一個班級通知另一個班級某些事情是可以的。我可以用Action來完成,然後在類中使用私有變量,但是想知道是否有直接的方法來處理屬性,以便在屬性值更改時更新另一個類的屬性。動作<T>等價於屬性

例如:

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

您是否擁有ILogger類,我的意思是,您可以對其進行更改嗎? – Stormenet 2012-03-27 13:57:14

+1

'ILogger'是否可以暴露'ILogic'可以訂閱的'AllOK'事件? – mellamokb 2012-03-27 13:57:22

+0

@Stormenet是的,我可以 – Jon 2012-03-27 14:02:43

回答

3

實現INotifyPropertyChanged接口和訂閱PropertyChanged事件

+0

我試圖避免這一點,但似乎是一種流行的方法。想想我會盡快與一個自定義事件 – Jon 2012-03-27 14:23:47

0

我覺得這可能是更傳統一點讓你的ILogger接口公開有點像「FileCreated」或「就緒「事件,並允許您的應用程序處理該事件以更新ILogic對象(或者執行其他任何必需的操作)。

編輯:我的道歉,重新閱讀問題後,我想我誤解了你的要求。

沒有任何「自然」的對象,做你問什麼,但你可以爲此創建一個匿名委託(或lambda表達式):

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

的屬性內部包括兩個私有方法,一個get_XXX和一個set_XXX,所以除非你想獲取這些方法的MethodInfo並調用它們(它們都是方法),否則你別無選擇,只能實現一種方法調用方法。

0

訂閱事件(INotifyPropertyChanged或某個自定義的)是可以的,傳遞lambda設置器的方法也是可以的,但在某些情況下,使用共享上下文對象可能更加方便(很像共享內存概念):

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

該對象被傳遞到所有感興趣的對象(ILogic和​​)和它們直接在其上進行操作,而不是一些內部屬性,。如果需要更改通知,請執行INotifyPropertyChanged

這種方法的一個積極方面是,您不會因重複觸發其他事件觸發事件而糾結等等。一個對象將保持當前狀態,並且不需要經常更新。

再次,這只是許多選擇之一。