.Net 之匿名物件(AnonymousObject)

iDotNetSpace發表於2010-12-14
  前言:最近園子裡面大談程式設計師基礎知識的文章,基礎知識的重要性無需多論了。看到大家對基礎知識的評論後突然想到這麼一個場景。曾經有個同事問我:有一個匿名物件想做為一個函式的返回值,可以麼?我當時堅定的回答---不可以。而他也深信不疑,似乎真的實現不了。如果我沒記錯的話當時是.NET3.5環境,如果當時是.NET4.0的話我就大錯特錯了。

   開始切入主題,我對.NET 匿名物件的認識如下:

     一、.NET3.5時代開始引入匿名物件概念


        .NET3.0 時,微軟加入了匿名物件到.net 中。javascript. 程式設計師對匿名物件並不陌生。但是對於當時的.NET程式設計師而言,應該屬於一個新鮮事物。.NET4.0可以讓我們例項化物件而不需要為該物件定義類。如何理解“例項化物件而不需要為該物件定義類”,還是用程式碼來解釋吧:

 
1 private static Object GetAnonymousObj()
2         {
3             Object anonymousObj = new { UserName = "admin", Password = "1111" };
4             return anonymousObj;
5         }

這裡並未在例項化物件前為anonymousObj物件建立相關的類,所以稱anonymousObj物件為匿名物件。


     二、.NET 4.0中將匿名物件作為函式返回值


      回到本文開頭引入的前言部分-- 匿名物件可以作為函式返回值麼?在.NET4.0中這個已經成為現實。

      請看一下程式碼範例,將匿名物件作為返回值:

 
1 private static Object GetAnonymousObj()
2         {
3             Object anonymousObj = new { UserName = "admin", Password = "1111" };
4             return anonymousObj;
5         }

     很簡單的一段程式碼,讓我們將anonymousObj這個匿名物件作為了函式返回值。但是在呼叫該函式時發現了問題,我們沒法這樣做:

     Object bj = GetAnonymousObj();

     Console.WriteLine(obj.UserName); // 這裡將無法編譯。因為obj物件是Object型別。

     因此在.net3.5時,我告訴同事這個還是不要這樣實現的好。換個方法吧?當.NET4.0時代來臨時,我們的問題得到妥善的解決 ---- 首先由Dynamic 型別隆重登場:(Dynamic簡單介紹

     先將上文中的GetAnonymousObj函式改造成返回dynamic 型別:

 
1 private static dynamic GetAnonymousObj()
2         {
3             dynamic anonymousObj = new { UserName = "admin", Password = "1111" };
4             return anonymousObj;
5         }

接著呼叫GetAnonymousObj()方法:

 
1 static void Main(string[] args)
2         {
3             dynamic o = GetAnonymousObj();
4             Console.WriteLine(o.UserName);
5             Console.ReadKey();
6         }

輸出>>admin.

匿名物件也許在您的專案中運用的並不是很多,但我的專案大部分是建立在LinqToSQL的基礎上,所以我們常常會寫出這樣的程式碼:在LINQ查詢語句中使用匿名物件。比如:

 
1 var user = from user in Users
2                 select new { user.Name, user.Id} //匿名物件


     三、.NET中匿名物件的其他注意事項


  •  匿名物件繼承於System.Object。
  • 匿名物件屬性均為只讀屬性(ReadOnly)。
  • 在同一個程式集內,兩個匿名物件具有相同的屬性、相同的屬性順序。編譯器將認為這兩個匿名物件是相同的。

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

相關文章