項目中很多地方采用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;
}
}