如何编写触发器

本文关键字:触发器 何编写 | 更新日期: 2023-09-27 18:06:17

我希望我的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();
}

如何编写触发器

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!");
};

如果你想在属性设置时触发一个事件,你可以这样做:

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

然后你只需将事件处理程序连接到你的对象,像这样:

 mc = new MyClass();
 mc.OnDataChanged += delegate() { Console.WriteLine("It changed!"); };
 mc.Data = SomeValue();

我认为您使用基于事件的模型是正确的。还可以看一下观察者模式(据我所知,它是。net委托和事件的基础):

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

但是,正如目前为止其他有用的答案(Mr. Gravell的实现)所表明的那样,您必须在 setter中使用代码才能将其连接起来。唯一的替代方案是轮询值以获取更改,这对我来说很糟糕。

你可以实现INotifyPropertyChanged(这或多或少是一个事件),或者你可以把你的类一个Action (Trigger),并调用这个,当属性改变。

只是不要使用自动属性,而是使用一个具体的setter并从那里调用事件/触发器。

从概念上讲,您将在类中定义一个事件,并在属性集块中调用带有必要参数的事件,以确定刚刚发生了什么。

 public event SomeDelegateThatTakesIntAsParameter myEvent;
 void SetData(int data)
 {
   if(myEvent!= null)
     myEvent(data)
 }