C# 4.0 新物件ExpandoObject

iDotNetSpace發表於2009-10-22

 今天無意中看了4.0的一些新特性,其中看到SystemDynamic 名稱空間下的ExpandoObject 類很感興趣,看了篇英文文章給大夥分享下。

先來看下該類的成員:

  http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject_members(VS.100).aspx

ExpandoObject instances can add and remove members at run time.什麼意思呢?這意味著此類的例項能夠在執行時動態的增加和刪除成員。

其中有個新概念:dynamic language runtime (DLR)(動態語言執行時),我才疏學淺,還希望各位專家們多去研究下。

說說ExpandoObject這個動態特性的意義吧。

我們用XML來做下對比:

首先我們建立一個XML物件,

 

C# 4.0 新物件ExpandoObject
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtXElement contactXML =
    
new XElement("Contact",
        
new XElement("Name""Patrick Hines"),
        
new XElement("Phone""206-555-0144"),
        
new XElement("Address",
            
new XElement("Street1""123 Main St"),
            
new XElement("City""Mercer Island"),
            
new XElement("State""WA"),
            
new XElement("Postal""68042")
        )
    );

再來看看Dynamic物件,

 

C# 4.0 新物件ExpandoObject
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtdynamic contact = new ExpandoObject();
contact.Name 
= "Patrick Hines";
contact.Phone 
= "206-555-0144";
contact.Address 
= new ExpandoObject();
contact.Address.Street 
= "123 Main St";
contact.Address.City 
= "Mercer Island";
contact.Address.State 
= "WA";
contact.Address.Postal 
= "68402";

 

首先,我們看下dynamic物件的宣告:dynamic contact = new ExpandoObject();

 

我沒有寫成 ExpandoObject contact = new ExpandoObject(), 因為我用靜態的ExpandoObject 型別來宣告則此物件沒有在執行時增加成員的特性,所以我使用新的關鍵字dynamic.

其次,大家能注意到,我建立一個子節點只需要建立一個ExpandoObject例項作為contact物件的成員。

這樣你可以很簡單的看清父子節點之間的關係,更重要的是你可以很簡單的訪問每一個元素。

用linq to XML:

Console.WriteLine((string)contactXML.Element("Address").Element("State"));

用 ExpandoObject物件:

Console.WriteLine(contact.Address.State);
可是,當你有很多個contact物件時該怎麼辦呢?
呵呵,看程式碼:
C# 4.0 新物件ExpandoObject
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt//用XML 方式:
XElement contactsXML =
    
new XElement("Contacts",
        
new XElement("Contact",
            
new XElement("Name""Patrick Hines"),
            
new XElement("Phone""206-555-0144")
        ),
        
new XElement("Contact",
            
new XElement("Name""Ellen Adams"),
            
new XElement("Phone""206-555-0155")
        )
    );


//用dynamic物件:
dynamic contacts = new List<dynamic>();

contacts.Add(
new ExpandoObject());
contacts[
0].Name = "Patrick Hines";
contacts[
0].Phone = "206-555-0144";

contacts.Add(
new ExpandoObject());
contacts[
1].Name = "Ellen Adams";
contacts[
1].Phone = "206-555-0155";

再來看看用Linq to Object怎麼來操作dynamic吧,

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtvar phones = from c in (contacts as List<dynamic>)
             
where c.Name == "Patrick Hines"
             select c.Phone;

 

大家看了這個新特性有什麼感受呢?想不想立刻感受下c# 4.0?不管怎麼樣我是很期待啦。。希望.net越來越強大~~你可是我的飯碗啊(PS:堅決不會轉向java)

原文地址:http://www.cnblogs.com/417533880/archive/2009/10/19/1585981.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-617203/,如需轉載,請註明出處,否則將追究法律責任。

相關文章