如何编写触发器
本文关键字:触发器 何编写 | 更新日期: 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)
}