匿名类型的最佳用例是什么?
在我看来,它们仅在有限的上下文中有用,例如一个类或一个函数。它们很难在这种情况之外使用,因为没有反射,没有人会知道这些类型可用的属性。
答案 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)
正确;它们只在极其有限的范围内实用。