2012-03-27 38 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

这种方法的一个积极方面是,您不会因重复触发其他事件触发事件而纠结等等。一个对象将保持当前状态,并且不需要经常更新。

再次,这只是许多选择之一。