Действие <T>эквивалент для свойств - PullRequest
5 голосов
/ 27 марта 2012

У меня есть класс, который создает два класса, которые реализуют интерфейсы. Я хочу, чтобы один класс уведомил другой класс, что что-то в порядке. Я мог бы сделать это с действием, а затем использовать частные переменные в классе, но подумал, существует ли прямой способ сделать это со свойствами, чтобы при изменении значения свойства обновлялось свойство в другом классе.

Например:

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 ]

3 голосов
/ 27 марта 2012

Реализация интерфейса INotifyPropertyChanged и подписка на PropertyChanged событие

0 голосов
/ 27 марта 2012

Подписка на событие (INotifyPropertyChanged или некоторый пользовательский) - это нормально, так же как и способ передачи лямбда-установщика, но в некоторых случаях может быть более удобно использовать объект общего контекста (во многом как общая память). концепция):

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

Этот объект передается всем заинтересованным объектам (ILogic и ILogger), и они воздействуют непосредственно на него, а не на некоторые внутренние свойства. Если требуются уведомления об изменениях, введите INotifyPropertyChanged на нем.

Один положительный аспект этого подхода заключается в том, что вы не будете запутываться в повторяющихся событиях, запускающих другие события и так далее. Один объект будет содержать текущее состояние, и периодические обновления не требуются.

Опять же, это только один из многих вариантов.

0 голосов
/ 27 марта 2012

Свойство внутренне состоит из двух частных методов, get_XXX и set_XXX, поэтому, если вы не хотите извлечь MethodInfo этих методов и вызвать их (которые снова являются методами), у вас нет выбора, кроме как реализовать подход вызова метода.

0 голосов
/ 27 марта 2012

Я чувствую, что может быть немного более привычным, чтобы ваш интерфейс ILogger представлял что-то вроде события FileCreated или Ready и позволял вашему приложению обрабатывать это событие для обновления объекта ILogic (или делать что-либо еще). остальное необходимо).

РЕДАКТИРОВАТЬ: мои извинения, после перечитывания вопроса, я думаю, что я неправильно понял, что вы просили.

Не существует "естественного" объекта, который бы выполнял именно то, что вы просите, но вы можете создать анонимный делегат (или лямбда-выражение) для этой цели:

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