可以说,这样做的唯一途径是创造某种“守望者”组成的,在一个单独的线程中运行,其工作是在间隔读取属性和提高物业价值发生变化时的事件。当然,这个解决方案会在线程和同步的黑暗水域中航行。
假设您的应用程序对于此对象是单线程的,您最简洁的解决方案是通过代理对象对此对象进行方法调用。它会检查财产的前后状态,并在事件发生变化的情况下提出事件。
这里是我说的什么一个简单的例子:
public class SomeProxy
{
public SomeProxy(ExternalObject obj)
{
_obj = obj;
}
public event EventArgs PropertyChanged;
private bool _lastValue;
private ExternalObject _obj;
protected virtual void OnPropertyChanged()
{
if(PropertyChanged != null)
PropertyChanged();
}
protected virtual void PreMethodCall()
{
_lastValue = _obj.SomeProperty;
}
protected virtual void PostMethodCall()
{
if(_lastValue != _obj.SomeProperty)
OnPropertyChanged();
}
// Proxy method.
public SomeMethod(int arg)
{
PreMethodCall();
_obj.SomeMethod(arg); // Call actual method.
PostMethodCall();
}
}
很明显,你可以建立这种代理模式到合适的对象 - 你只需要知道所有呼叫不得不经历当你期望它成为事件的代理人时。
我想我将不得不走下来的投票路线,不是我所期待的,因为数据可以在调查时机来reduntant(我想要在数据被其他功能使用之前捕获数据) – ThePower 2009-08-06 10:52:19
或者用你自己的支持INotify或你自己的实现的类来包装类? – Pondidum 2009-08-07 10:11:01
@安迪:这取决于。如果你这样做,那么你不能使用类作为原始类型,代码中的其他位可能需要。 – 2009-08-07 10:37:46