如何在C#中使用匿名类型?

时间:2008-09-07 18:34:33

标签: c# anonymous-types

我已经看到很多关于匿名类型如何工作的描述,但我不确定它们是如何真正有用的。有哪些场景可以使用匿名类型在精心设计的程序中解决?

7 个答案:

答案 0 :(得分:18)

匿名类型与系统设计甚至是类级别无关。它们是开发人员在编码时使用的工具。

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

例如:

var query = from item in database.Items
            // ...
            select new { Id = item.Id, Name = item.Name };

return query.ToDictionary(item => item.Id, item => item.Name);

没有人关心`a,匿名类型。它就在那里,所以你不必申报另一个班级。

答案 1 :(得分:8)

从LINQ实施(第76页第2.6.3节):

  

...匿名类型[是]快速简单的临时结果的绝佳工具。由于临时类型,我们不需要声明类来保存临时结果。

基本上它们对于暂时保存本地范围内的信息很有用。任何更多需要使用反射,可能会成为一个很大的问题。他们在上面引用的书中给出的示例是写入控制每个正在运行的进程占用的内存的ID,名称和数量。它们创建一个匿名类型,将其添加到列表(所有一个语句),然后使用ObjectDumper输出它。因此,代码不再需要一个单独声明的类来保存所使用的id,name和内存,但是所有声明都隐式地将行数减少到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);

答案 2 :(得分:2)

最常用的匿名类型用于在LINQ to SQL查询中指定投影。

此查询

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

将转换为此SQL:

SELECT Column1, Column2 AS Alias2 FROM Table1

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

答案 3 :(得分:1)

为“使用和投掷”目的创建类型时。 这似乎是由LINQ引起的。似乎是一种为LINQ查询动态创建具有字段的结构的方法。仅返回包含指定字段的结构/类型。如果不是这样,您必须为要检索的每个唯一字段组合声明.Net类型。

答案 4 :(得分:1)

将它们与Linq一起使用。

答案 5 :(得分:0)

重要的是要知道LINQ不会强迫您使用匿名类型。您也可以在选择后编写普通对象构造。

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

这可以防止您进行难看的反射编程。

答案 6 :(得分:-1)

@Wouter:

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

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

相关问题