每当为我的对象赋值时,我希望我的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();
}
答案 0 :(得分:5)
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!");
};
答案 1 :(得分:2)
如果您想在设置属性时触发事件,则可以执行以下操作:
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();
答案 2 :(得分:2)
我认为你在基于事件的模型上走在正确的轨道上。还要看一下Observer模式(根据我的理解,它是.Net委托和事件的基础),所有这些都是:
http://www.dofactory.com/Patterns/PatternObserver.aspx
但是底线,作为迄今为止另一个有用的答案(Gravell先生的实现)表明,你将不得不使用代码 IN 设置器来连接它。唯一的选择是轮询变化的价值,这对我来说闻起来很糟糕。
答案 3 :(得分:1)
你可以实现INotifyPropertyChanged(这或多或少是一个事件),或者你可以把你的类作为一个Action(Trigger)并在属性改变时调用它。
只是不要使用自动属性,而是使用具体的设置器并从那里调用事件/触发器。
答案 4 :(得分:1)
从概念上讲,您将在类中定义一个事件,并在属性集块中,使用必要的参数调用事件以确定刚刚发生的事件。
答案 5 :(得分:1)
public event SomeDelegateThatTakesIntAsParameter myEvent;
void SetData(int data)
{
if(myEvent!= null)
myEvent(data)
}