Как написать триггер? - PullRequest
       1

Как написать триггер?

1 голос
/ 23 августа 2011

Я хочу, чтобы мой код C # вызывал событие всякий раз, когда значение присваивается моему объекту.

Как именно мне нужно это сделать?

class MyClass {

  ManualResetEvent mre;

  public MyClass() {
    mre = new ManualResetEvent(false);
    Data = null;
  }

  public object Data { get; set; }

  void DataSet(object sender, EventArgs e) {
    Console.WriteLine("object Data has been set.");
    mre.Set();
  }

}

Кажется, что делегаты - не то, что мне нужно. Может быть, событие? Как бы я написал такое событие, если так?

MyClass mc;

void processA() {
  mc = new MyClass();
  mc.Data = GetDataFromLongProcess();
}

Ответы [ 6 ]

5 голосов
/ 23 августа 2011
private object data;
public object Data {
    get { return data;}
    set {
        if(value != data) {
            data = value;
            OnDataChanged();
        }
    }
}
protected virtual void OnDataChanged() {
    EventHandler handler = DataChanged;
    if(handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler DataChanged;

, затем подключите любой код к событию DataChanged.Например:

MyClass mc = ...
mc.DataChanged += delegate {
    Console.WriteLine("new data! wow!");
};
2 голосов
/ 23 августа 2011

Я думаю, что вы на правильном пути с моделью, основанной на событиях. Также взгляните на шаблон Observer (который, как я понимаю, является основой для делегатов .Net и событий под ним):

http://www.dofactory.com/Patterns/PatternObserver.aspx

Но, как показывает другой полезный ответ (реализация г-на Гравелла), вам понадобится код IN для установки, чтобы он был подключен. Единственной альтернативой было бы опросить значение для изменений, которые пахнут плохо для меня.

2 голосов
/ 23 августа 2011

Если вы хотите инициировать событие, когда ваше свойство установлено, вы должны сделать что-то вроде этого:

 public event Action OnDataChanged;

 protected object _data = null;
 public object Data
 {
     get { return _data; }
     set
     {
         _data = value;
         if(OnDataChanged != null)
            OnDataChanged();
     }
 }

Тогда вы просто подключите обработчики событий к вашему объекту так:1005 *

1 голос
/ 23 августа 2011
 public event SomeDelegateThatTakesIntAsParameter myEvent;
 void SetData(int data)
 {
   if(myEvent!= null)
     myEvent(data)
 }
1 голос
/ 23 августа 2011

Концептуально вы определяете событие в своем классе, а в блоках своего набора свойств вы вызываете событие с необходимыми аргументами для определения того, что только что произошло.

1 голос
/ 23 августа 2011

вы можете реализовать INotifyPropertyChanged (это более или менее событие) или вы можете взять свой класс Action (Trigger) и вызвать его, когда свойство изменилось.конкретный сеттер и назовите ваше событие / триггер оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...