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