項目中很多地方采用dynamic新特性進行開發,因此本人參看了很多關於dynamic的資料。在新的一年開始 ,記錄下自己的學習經驗。
dynamic關鍵字用於聲明一個動態對象,然後通過該動態對象去調用方法或 讀寫屬性。
(一)測試Alexandra Rusina提供的參考資料
參考 http://blogs.msdn.com/b/csharpfaq/archive/2009/10/19/dynamic-in-c-4-0-creating-wrappers-with- dynamicobject.aspx ,因此對該地址的博文中DynamicXMLNode類進行相應的學習與測試。測試如下:
static void Main(string[] args) { //正常運行 RunDynamicXMLNode(true); //異常運行 RunDynamicXMLNode(false); Console.ReadLine(); }
private static void RunDynamicXMLNode(bool state) { Console.WriteLine("------RUN begin------"); try { dynamic contact = new DynamicXMLNode("Contacts"); contact.Name = "Patrick Hines"; if (state) { contact.Address = new DynamicXMLNode(); } contact.Address.Street = "123 Main St"; } catch (RuntimeBinderException ex) { Console.WriteLine(ex.Message); } Console.WriteLine("------RUN end--------"); }
運行後顯示結果如下:
設置斷點進行單步調試,發現TryGetMember方法中:如果當前元素XElement下沒有相應的XName的 子元素,那麼result = null;
正常運行contact.Address = new DynamicXMLNode();創建了一個新的 dynamic對象。反之,contact.Address =null;將導致RuntimeBinderException異常。
public override bool TryGetMember(GetMemberBinder binder, out object result) { XElement getNode = node.Element(binder.Name); if (getNode != null) { result = new DynamicXMLNode(getNode); return true; } else { result = null; return false; } }