如何在C#中使用匿名types?

我已经看到很多描述匿名types的工作,但我不确定它们是如何真正有用的。 在一个devise良好的程序中,匿名types可以用来解决什么情况?

匿名types与系统devise甚至在课堂级别无关。 它们是开发人员在编码时使用的工具。

我甚至不把匿名types视为types本身。 我主要将它们用作方法级的匿名元组。 如果我查询数据库,然后操纵结果,我宁愿创build一个匿名types,并使用它,而不是声明一个全新的types,永远不会被使用或在我的方法的范围之外已知。

例如:

var query = from item in database.Items // ... select new { Id = item.Id, Name = item.Name }; return query.ToDictionary(item => item.Id, item => item.Name); 

没有人关心'匿名types'。 它在那里,所以你不必申报另一个class级。

来自LINQ的行动(第76页2.6.3小节):

…匿名types[是]快速和简单的临时结果的一个伟大的工具。 由于临时types,我们不需要声明类来保存临时结果。

基本上他们暂时把信息保存在本地范围内是有用的。 还有什么需要使用reflection,可以成为一个相当大的问题。 他们在上面引用的书中给出的例子是写在控制每个正在运行的进程占用的内存的ID,名称和数量。 他们创build一个匿名types,将它添加到一个列表(所有语句),然后使用ObjectDumper输出它。 因此,代码不再需要一个单独声明的类来保存使用的id,名称和内存,但是它的所有声明隐含地将行数减less到4:

 var pl = new List<Object>(); foreach(var p in Process.GetProcesses()) pl.Add(new {p.Id, p.ProcessName, Memory=p.WorkingSet64}); ObjectDumper.Write(pl); 

与Linq一起使用。

匿名types最常用的用法是在LINQ to SQL查询中指定投影。

这个查询

 from x in db.Table1 select new {x.Column1, Alias2=x.Column2} 

将被转换为这个SQL:

 SELECT Column1, Column2 AS Alias2 FROM Table1 

使用匿名types,您可以创build临时投影,而无需事先定义types。 编译器将为您定义types。

当你创build“使用和抛出”types的types。 这似乎是由于LINQ。 似乎是为LINQ查询创build带有字段的结构的一种方法。 仅返回指定字段的结构/types。 如果不是这样,你将不得不声明一个.Nettypes的每个独特的字段组合,你想检索。

知道LINQ不强迫你使用匿名types是很重要的。 select后,您也可以编写普通的对象结构。

 var query = from item in database.Items // ... select new Person(item.id, item.Name) 

这可以防止你从难看的reflection编程。

@Wouter:

 var query = from item in database.Items select new Person { ID =item.id, NAME= item.Name }; 

其中ID和NAME是您Person类的不动产。