可以说,做到这一点的唯一真正方法是创建某种“观察者”组件,在单独的线程中运行,其工作是每隔一段时间读取属性并在属性值更改时引发事件。当然,这个解决方案在线程和同步的混沌水域中航行。
假设您的应用程序对于此对象是单线程的,您最简洁的解决方案是通过代理对象对该对象进行方法调用。它将负责检查属性的前后状态,并在它发生变化的情况下引发事件。
这是我正在谈论的一个简单示例:
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();
}
}
显然,您可以将此代理模式构建到合适的对象中——您只需要知道所有调用都必须通过代理才能在您期望的时候引发事件。