我读过一些关于如何在C#中创建匿名类型的文章。
这些东西有哪些用例?对我来说,似乎可能会让事情变得更加难以理解为内联声明对象及其成员。
何时使用匿名类型是有意义的?
答案 0 :(得分:6)
当我需要绑定到不完全符合我需要的集合时,我喜欢使用匿名类型。例如,这是我的应用程序中的示例:
var payments = from terms in contract.PaymentSchedule
select new
{
Description = terms.Description,
Term = terms.Term,
Total = terms.CalculatePaymentAmount(_total),
Type=terms.GetType().Name
};
然后我将datagrid绑定到payments.ToList()。这里的事情是我可以聚合多个对象而无需分配中间人。
答案 1 :(得分:3)
我经常在数据绑定到复杂控件时使用它们 - 比如网格。 它为我提供了一种简单的方法来格式化我发送给控件的数据,使控制器更容易显示该数据。
GridView1.DataSource = myData.Select(x => new {Name = x.Description,Date = x.Date.ToShortDate()});
但是,稍后,在代码稳定之后,我会将匿名类转换为命名类。
我还有一些案例(Reporting Services),我需要使用非关系数据加载它们,而Reporting Services要求数据为FLAT!我使用LINQ / Lambda来轻松地为我平整数据。
答案 2 :(得分:2)
LINQ /λ的
var quantity = ...
var query = db.Model.Select( m => new
{
Name = m.Name,
Price = m.Price,
Cost = M.Price * quantity
} );
foreach (var q in query)
{
Console.WriteLine( q.Name );
Console.WriteLine( q.Price );
Console.WriteLine( q.Cost );
}
ASP.NET MVC -HtmlHelpers或返回JSON时
<%= Html.TextBox( "Name", Model.Name, new { @class = "required" } ) %>
public ActionResult SearchModels( var q, int limit )
{
var query = db.Models.Where( m => m.Name.StartsWith( q ) )
.Take( limit )
.Select( m => new { m.DisplayName, m.Name, m.ID } );
return Json( query.ToList() );
}
实际上,几乎任何地方你只需要一个临时容器类型来进行短暂的行动。
答案 3 :(得分:2)
来自马(微软)mouth:
匿名类型提供了方便 封装一组只读方法 属性转换为单个对象 无需先明确表达 定义一个类型。
匿名类型在您通常使用已定义结构但不想使用的区域中非常有用,因为它只会在有限范围内使用。我倾向于将它们用作数据源或聚合(总和,计数等)值的容器。
答案 4 :(得分:1)
我发现它们是简单的struct / structure对象的非常有用的替代品,尤其是在使用VB.NET时,因为它不支持自动实现的属性。
答案 5 :(得分:0)
使用LINQ
时,它们非常有用var query = from c in listOfCustomers
select new {FirstName = c.Name,c.City};
答案 6 :(得分:0)
Here是查理卡尔弗特关于匿名类型用法的好文章。
答案 7 :(得分:0)
就个人而言,我对匿名类型没有太多用处。他们肯定会至少使用一定程度的谨慎。通常使用它们的情况是在创建重新命名多个值的LINQ查询时,您只需要在函数持续时间内使用查询的数据。 (如果需要在外部使用数据,则不能使用匿名类型 - 您需要声明自己的,并且有充分的理由,即可读性。)更一般地说,它们有时在使用普通的lambda表达式时很有用,尽管我自己也很少需要它们。 (当我说需要时,根据上下文几乎有其他选择,但有时匿名类型实际上是最优雅的选项。)如果你想要一个代码示例,请告诉我,我我会试着想出一个有一些相当不错的应用程序。