Action <t>等效于属性</t>

时间:2012-03-27 13:46:39

标签: c# .net c#-4.0 delegates

我有一个实例化两个实现接口的类的类。我想要一个类通知另一个类,某些东西没问题。我可以使用Action执行它,然后在类中使用私有变量,但是想知道是否有一种直接的方法可以使用属性,这样当属性值更改时,它会更新另一个类的属性。

例如:

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
  }
}

4 个答案:

答案 0 :(得分:3)

实施INotifyPropertyChanged界面并订阅PropertyChanged事件

答案 1 :(得分:0)

我觉得让ILogger接口暴露像“FileCreated”或“Ready”事件这样的事情可能会更常规,并允许你的应用程序处理该事件以更新ILogic对象(或做任何事情)其他是必要的。)

编辑:道歉,在重新阅读问题之后,我想我误解了你的要求。

没有任何“自然”对象完全符合您的要求,但您可以为此创建一个匿名委托(或lambda表达式):

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

答案 2 :(得分:0)

一个属性内部由两个私有方法组成,一个是get_XXX和一个set_XXX,所以除非你想获取那些方法的MethodInfo并调用它们(它们再次是方法),否则你别无选择,只能实现方法调用方法。

答案 3 :(得分:0)

订阅事件(INotifyPropertyChanged或某些自定义的)是正常的,传递lambda-setter的方法也是如此,但在某些情况下,使用共享上下文对象可能更方便(很像共享内存概念):

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

此对象传递给所有感兴趣的对象(ILogicILogger),它们直接在其上运行,而不是一些内部属性。如果需要更改通知,请在其上实施INotifyPropertyChanged

这种方法的一个积极方面是你不会纠结于反复触发事件触发其他事件等等。单个对象将保持当前状态,不需要重复更新。

同样,这只是众多选择中的一种。