可以說,這樣做的唯一途徑是創造某種「守望者」組成的,在一個單獨的線程中運行,其工作是在間隔讀取屬性和提高物業價值發生變化時的事件。當然,這個解決方案會在線程和同步的黑暗水域中航行。
假設您的應用程序對於此對象是單線程的,您最簡潔的解決方案是通過代理對象對此對象進行方法調用。它會檢查財產的前後狀態,並在事件發生變化的情況下提出事件。
這裏是我說的什麼一個簡單的例子:
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