如何编写触发器?

每当为我的对象赋值时,我希望我的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(); 

我认为你在基于事件的模型上走在正确的轨道上。 还要看一下Observer模式(根据我的理解,它是.Net委托和事件的基础),正如我所理解的那样:

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

但是底线,作为迄今为止另一个有用的答案(Gravell先生的实现)表明,你将不得不在setter中设置代码以使其连接起来。 唯一的选择是轮询变化的价值,这对我来说闻起来很糟糕。

您可以实现INotifyPropertyChanged(这或多或少是一个事件),或者您可以将您的类作为Action(触发器)并在属性更改时调用它。

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

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

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