淺析C# Anonymous Type
C# Anonymous Type和一般的Named Type并沒有本質(zhì)的區(qū)別。但是話不能太絕對,他們之間還是有一點小小的差異。到底是什么樣差異,我在這里先賣一個關(guān)子。在具體介紹這個差異的時候,我們先來看看一個Sample:
 
Artech.NewFeatureInCSharp.Library中定一個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;}
 - }
 - }
 - }
 
和一個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中定義了兩個GetEmployee方法,分別返回以Anonymous Type形式和Named Type形式的Employee對象。
- 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é)構(gòu)。這個結(jié)構(gòu)分兩部分,第一部分是基于C# Anonymous Type的,另一部分是基于Named Employee Type的。在第一部分中,我首先創(chuàng)建了3個C# Anonymous Type的Instance:v1、v2和v3(v3是通過調(diào)用定義在Artech.NewFeatureInCSharp.Library中的Utility獲得,其余兩個則直接通過Inline的方式創(chuàng)建),第二部分也具有相同的代碼結(jié)構(gòu)。
【編輯推薦】















 
 
 
 
 
 
 