我已经阅读了一些关于如何在C#中创建匿名类型的文章。
这些东西有什么用途?对我来说,似乎这可能会使声明对象及其成员更加困难。
什么时候使用匿名类型是有意义的?
我已经阅读了一些关于如何在C#中创建匿名类型的文章。
这些东西有什么用途?对我来说,似乎这可能会使声明对象及其成员更加困难。
什么时候使用匿名类型是有意义的?
当我需要绑定到一个不完全符合我需求的集合时,我喜欢使用匿名类型。例如,以下是我的应用程序示例:
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()。重要的是,我可以聚合多个对象而不必定义中间变量。
我经常在数据绑定到复杂控件时使用它们,比如网格。
这为我提供了一种简单的方法来格式化我发送给控件的数据,使得控件更容易处理该数据的显示。
GridView1.DataSource = myData.Select(x => new {Name=x.Description, Date = x.Date.ToShortDate() });
但是,在代码稳定后,我会将匿名类转换为命名类。
我还有一些情况(报告服务),需要使用非关系型数据进行加载,而报告服务要求数据是FLAT的!我使用LINQ/Lambda轻松地将数据扁平化。
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() );
}
我认为它们是简单结构对象的非常有用的替代品,特别是在使用VB.NET时,因为它不支持自动实现属性。
就我个人而言,我并不觉得匿名类型有太多用处。至少在使用时需要谨慎。它们通常用于创建返回多个值的LINQ查询,并且您只需要在函数执行期间利用查询到的数据。(如果需要在外部使用数据,则无法使用匿名类型 - 您需要声明自己的类型,这是出于良好的可读性考虑。)更一般地说,当使用普通的lambda表达式时,它们有时可能会有用,尽管我自己很少需要它们。(当我说需要时,根据上下文几乎总有替代方案,但是匿名类型有时确实是最优雅的选择。)如果您需要一个代码示例,请告诉我,我会尝试提供一个具有合理应用的示例。