間違いなく、これを行う唯一の実際の方法は、別のスレッドで実行されるある種の「ウォッチャー」コンポーネントを作成することです。このコンポーネントの仕事は、プロパティを定期的に読み取り、プロパティの値が変更されたときにイベントを発生させることです。もちろん、このソリューションは、スレッド化と同期化の濁った海域を航行します。
アプリケーションがこのオブジェクトに関してシングルスレッドであると仮定すると、最もクリーンな解決策は、プロキシオブジェクトを介してこのオブジェクトへのメソッド呼び出しを行うことです。物件の前後の状態をチェックし、変更された場合はイベントを発生させる役割があります。
これが私が話していることの簡単な例です:
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();
}
}
明らかに、このプロキシパターンを適切なオブジェクトに組み込むことができます。イベントが発生すると予想されるときに、すべての呼び出しがプロキシを経由する必要があることに注意する必要があります。