淺析C# Anonymous Type
C# Anonymous Type和一般的Named Type并沒有本質(zhì)的區(qū)別。但是話不能太絕對(duì),他們之間還是有一點(diǎn)小小的差異。到底是什么樣差異,我在這里先賣一個(gè)關(guān)子。在具體介紹這個(gè)差異的時(shí)候,我們先來看看一個(gè)Sample:
 
Artech.NewFeatureInCSharp.Library中定一個(gè)Employee Type:
- usingSystem;
 - usingSystem.Collections.Generic;
 - usingSystem.Linq;
 - usingSystem.Text;
 - namespaceArtech.NewFeatureInCSharp.Library
 - {
 - publicclassEmployee
 - {
 - privateGuid_id;
 - privatestring_name;
 - publicGuidID
 - {
 - get{return_id;}
 - set{_id=value;}
 - }
 - publicstringName
 - {
 - get{return_name;}
 - set{_name=value;}
 - }
 - }
 - }
 
和一個(gè)Static的Utility Class:
- usingSystem;
 - usingSystem.Collections.Generic;
 - usingSystem.Linq;
 - usingSystem.Text;
 - namespaceArtech.NewFeatureInCSharp.Library
 - {
 - publicstaticclassUtility
 - {
 - publicstaticobjectAnonymous_GetEmployee(Guidid,stringname)
 - {
 - returnnew{ID=id,Name=name};
 - }
 - publicstaticEmployeeGetEmployee(Guidid,stringname)
 - {
 - returnnewEmployee{ID=id,Name=name};
 - }
 - }
 - }
 
在Utility中定義了兩個(gè)GetEmployee方法,分別返回以Anonymous Type形式和Named Type形式的Employee對(duì)象。
- usingSystem;
 - usingSystem.Collections.Generic;
 - usingSystem.Linq;
 - usingSystem.Text;
 - usingArtech.NewFeatureInCSharp.Library;
 - namespaceArtech.NewFeatureInCSharp.ConsoleApp
 - {
 - classProgram
 - {
 - staticvoidMain(string[]args)
 - {
 - varv1=new{ID=Guid.NewGuid(),Name="ZhangSan"};
 - varv2=new{ID=Guid.NewGuid(),Name="LiSi"};
 - varv3=Utility.Anonymous_GetEmployee(Guid.NewGuid(),"WangWu");
 - Console.WriteLine("varv1=new{ID=Guid.NewGuid(),Name=\"ZhangSan\"};");
 - Console.WriteLine("varv2=new{ID=Guid.NewGuid(),Name=\"LiSi\"};");
 - Console.WriteLine("varv3=Utility.Anonymous_GetEmployee(Guid.NewGuid(),\"WangWu\");");
 - Console.WriteLine("\nv1.GetType()={0}",v1.GetType());
 - Console.WriteLine("v2.GetType()={0}",v2.GetType());
 - Console.WriteLine("v3.GetType()={0}",v3.GetType());
 - Console.WriteLine("\nobject.ReferenceEquals(v1.GetType(),v2.GetType())={0}",
 
object.ReferenceEquals(v1.GetType(),v2.GetType()));- Console.WriteLine("object.ReferenceEquals(v1.GetType(),v3.GetType())={0}",
 
object.ReferenceEquals(v1.GetType(),v3.GetType()));- Console.WriteLine("\n\n");
 - varv4=newEmployee{ID=Guid.NewGuid(),Name="ZhangSan"};
 - varv5=newEmployee{ID=Guid.NewGuid(),Name="LiSi"};
 - varv6=Utility.GetEmployee(Guid.NewGuid(),"WangWu");
 - Console.WriteLine("varv4=newEmployee{ID=Guid.NewGuid(),Name=\"ZhangSan\"};");
 - Console.WriteLine("varv5=newEmployee{ID=Guid.NewGuid(),Name=\"LiSi\"};");
 - Console.WriteLine("varv6=Utility.GetEmployee(Guid.NewGuid(),\"WangWu\");");
 - Console.WriteLine("\nv4.GetType()={0}",v4.GetType());
 - Console.WriteLine("v5.GetType()={0}",v5.GetType());
 - Console.WriteLine("v6.GetType()={0}",v6.GetType());
 - Console.WriteLine("\nobject.ReferenceEquals(v4.GetType(),v5.GetType())={0}",
 
object.ReferenceEquals(v4.GetType(),v5.GetType()));- Console.WriteLine("object.ReferenceEquals(v4.GetType(),v6.GetType())={0}",
 
object.ReferenceEquals(v4.GetType(),v6.GetType()));- }
 - }
 - }
 
代碼不復(fù)雜,我在這里簡(jiǎn)單介紹一下整體的結(jié)構(gòu)。這個(gè)結(jié)構(gòu)分兩部分,第一部分是基于C# Anonymous Type的,另一部分是基于Named Employee Type的。在第一部分中,我首先創(chuàng)建了3個(gè)C# Anonymous Type的Instance:v1、v2和v3(v3是通過調(diào)用定義在Artech.NewFeatureInCSharp.Library中的Utility獲得,其余兩個(gè)則直接通過Inline的方式創(chuàng)建),第二部分也具有相同的代碼結(jié)構(gòu)。
【編輯推薦】















 
 
 
 
 
 
 