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

Rea*_*nly 15 c# anonymous-types

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

Ome*_*ten 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);
Run Code Online (Sandbox Code Playgroud)

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

  • 我没有修改结果,我正在将它们转换成更容易返回的其他形式.一个人应该小心不要在多个方法上过度分配他们的代码,因为这会使代码完全不可读和创建,因为没有能力使用匿名类型,很多丑陋的代码或冗余的手动编码类型. (4认同)

Geo*_*uer 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);
Run Code Online (Sandbox Code Playgroud)