匿名类型的目的是什么?

时间:2009-06-22 16:21:58

标签: .net anonymous-types

匿名类型的最佳用例是什么?

在我看来,它们仅在有限的上下文中有用,例如一个类或一个函数。它们很难在这种情况之外使用,因为没有反射,没有人会知道这些类型可用的属性。

6 个答案:

答案 0 :(得分:4)

匿名类型仅用于非常狭窄的范围。我用过的大多数用例涉及到Linq。

var result = from x in MyCollection
             select new 
             {
                 x.Prop1, 
                 x.Prop2
             };

此外,在Linq to SQL的情况下 - 使用匿名类型将通过仅选择匿名类型中使用的列来生成不同的SQL。在上面的例子中(如果它是一个Linq to SQL查询),它将生成类似“从mytable中选择prop1,prop2”而不是选择所有字段。

我从未遇到过(我)想要在我的代码中声明一个新的匿名类型的情况。我想如果还有其他什么,也许它对本地常量很有用?

var x = new
        {
            FirstName = "Scott",
            LastName = "Ivey"
        };

答案 1 :(得分:2)

然而,它并没有停止,例如ASP.NET MVC团队将它们用作Hashtable样式的参数对象......

Url.Action(new{controller="Home", action="Index"})

但是,我不鼓励,因为大量使用魔法弦。

我几乎只在LINQ语句中使用匿名类型,在同一方法中迭代结果集。这就是他们被引入的原因

答案 2 :(得分:2)

我发现匿名类型有用的一个案例是将对象序列化为JSon并在ASP.NET MVC操作中返回它们。您不一定要返回对象的所有属性,而匿名类型可以帮助您解决此问题。

[AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Person(int id)
    {
        Person person = manager.GetPersonById(id);
        if(Request.IsAjaxRequest())
            return Json(new {Name=person.Name, Age=person.Age,...});
        else
            ...
    }

答案 3 :(得分:1)

当你想对某些对象运行查询然后对它们进行一些其他操作(如迭代)时,它们是有用的。

例如:

var procs = System.Diagnostics.Process.GetProcesses().Select(p => new { p.Id, p.ProcessName});
foreach(var p in procs)
{
    Console.WriteLine("{0}: {1}", p.Id, p.ProcessName);
}

答案 4 :(得分:1)

我最近很幸运地遇到了DataGrids或DataViews中的字段,这些字段依赖于不再返回相同数据的查询中的列。例如,有时数据源被标准化或由于各种原因重命名字段。使用LINQ查询将匿名类型作为“前端”返回,我们能够在生产中保留现有的网格。

答案 5 :(得分:0)

正确;它们只在极其有限的范围内实用。