2011-05-29 54 views
0

有無論如何創建一個動態檢索的方法,它以某種方式監視一個對象的狀態,但只需要調用一次,並將更新其結果,一旦它觀察的對象的狀態已被修改或以某種方式改變,這不等於該方法被調用之前的狀態。對象的狀態/方法的動態檢索

我有一個腳本這裏說明我的觀點:

bool isNull = false; 

    Object obj = new Object(); 

    isNull = (bool)obj.ExtNull(); 

    string reply = TestMethodA(isNull); 

    Console.WriteLine("Is object null? Answer: {0}. State of isNull: {1}", reply, isNull); 

    obj = null; 

    Console.WriteLine("\n\nNulling object... "); 
    Console.WriteLine("\n\nNew answer: "); 
    Console.WriteLine("\n\nIs object null? Answer: {0}. State of isNull: {1}", reply, isNull); 

    Console.Read(); 
} 

public static string TestMethodA(bool isNull) 
{ 
    string str; 

    if (isNull) 
     str = "yes"; 
    else 
     str = "no"; 

    return str; 

} 

我們可以看到,一個對象調用鑄成一個布爾值,它滿足了方法的返回類型的擴展方法。然後將該語句分配給bool isNull變量。

然後調用一個字符串,並分配TestMethodA,它將isNull作爲其參數。一旦在方法的參數中接收到isNull,它將分析布爾值是true還是false。如果它是真的(意思是該對象爲空),則在該方法內調用的字符串變量的值爲「是」。同樣,如果不是,它將採取「不」。

該字符串然後返回,並傳回給該方法。字符串和布爾值都在Console.WriteLine方法中發佈。

發生這種情況後,obj引用變量將自身賦值爲null,失去曾經引用的值。

WriteLine語句然後發佈與之前相同的語句,分析對象的布爾值和狀態。當然,儘管對象的狀態現在爲空,但是由於C#並沒有真正的指針(真正的恥辱,真的,現在我想到了它)而沒有不安全的代碼,有沒有什麼辦法實現這個動態?

回答

0

這是昂貴的,性能明智的,它不是完全實時的,但你可能能夠使用反應性擴展完成你想要的。

退房這裏的例子:

http://rxwiki.wikidot.com/101samples#toc1

具體來說,你對創建一個Observable.SampleObservable.Interval

除此之外,你可以去代理生成的路線......但涉及更多的控制你想觀察的實際類型。如果您控制了類型定義,則可以將所有屬性聲明爲虛擬,並使用動態代理創建類型的實例(Castle Windsor/DynamicProxy是執行此操作的一種工具,但也有其他工具)。你可以自動讓你的類型,執行INotifyPropertyChanged

http://www.codewrecks.com/blog/index.php/2008/08/04/implement-inotifypropertychanged-with-castledynamicproxy/

,只需綁定一個事件處理看PropertyChanged事件。

+0

太棒了。謝謝。 – zeboidlund 2011-05-29 04:52:24