【问题标题】:Action<T> equivalent for properties等价于属性的 Action<T>
【发布时间】:2012-03-27 13:46:39
【问题描述】:

我有一个类实例化两个实现接口的类。我希望一个班级通知另一个班级事情正常。我可以用 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
  }
}

【问题讨论】:

  • 您是否拥有 ILogger 类,我的意思是,您可以对其进行更改吗?
  • 可以ILogger 公开AllOK 事件ILogic 可以订阅吗?
  • @mellamokb 好主意,我只是想知道是否有直接使用属性的方法

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


【解决方案1】:

实现INotifyPropertyChanged接口并订阅PropertyChanged事件

【讨论】:

  • 我试图避免这种情况,但似乎是一种流行的方法。我想我会参加一个自定义活动
【解决方案2】:

我觉得让您的 ILogger 接口公开诸如“FileCreated”或“Ready”事件之类的东西,并允许您的应用程序处理该事件以更新 ILogic 对象(或执行任何操作)可能更传统一些否则是必要的)。

编辑:很抱歉,在重新阅读问题后,我想我误解了您的要求。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      同样,这只是众多选项之一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-21
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        相关资源
        最近更新 更多