7

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

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

4

6 回答 6

4

匿名类型仅用于非常狭窄的范围。我为他们提供的大多数用例都涉及 Linq。

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

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

我从来没有遇到过(还)我只想在我的代码中声明一个新的匿名类型的情况。我想如果还有其他的话,也许它对局部常量很有用?

var x = new
        {
            FirstName = "Scott",
            LastName = "Ivey"
        };
于 2009-06-22T16:30:46.903 回答
2

但是,它不会停止,例如 ASP.NET MVC 团队,您将它们用作 Hashtable 样式的参数对象......

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

不过,我不鼓励这样做,因为大量使用了魔术弦。

我几乎只在 LINQ 语句中使用匿名类型,在相同的方法中您可以遍历结果集。这就是他们被介绍的原因

于 2009-06-22T16:30:35.157 回答
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
            ...
    }
于 2009-06-22T17:05:28.603 回答
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);
}
于 2009-06-22T16:33:21.473 回答
1

最近,我很幸运能够满足 DataGrids 或 DataViews 中的字段,这些字段依赖于不再返回相同数据的查询中的列。例如,有时出于各种原因对数据源进行了规范化或重命名了字段。使用返回匿名类型的 LINQ 查询作为“前端”,我们能够在生产中保持现有网格。

于 2009-06-22T17:02:39.747 回答
0

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

于 2009-06-22T16:25:03.983 回答