在分析一些ASP.NET MVC项目时,我看到了遍布各地的匿名类型.
HTML助手有它们:
<%=Html.TextBox("view.Address", "address", new { Class = "text_field" })%>
很多动作的返回类型都有:
JsonNetResult jsonNetResult = new JsonNetResult { Formatting = Formatting.Indented, Data = new {Something= “”} }
我知道这来自LINQ:
from p in context.Data select new { p.Name, p.Age };
这些是否真的是在LINQ之外完成任务的正确方法?它们是否会损害代码的可重用性和可读性?
恕我直言,匿名类型的最大问题源于无法命名他们的类型.也就是说,不可能在代码中将匿名类型的类型明确指定为表达式.这实际上很难做出像创建通用List这样的事情.
var list = New List();
通常你必须求助于辅助方法.
public ListCreateList (T notUsed) { return new List (); } var list = CreateList(new { .Class = "foo" });
这也有一个更大的影响,因为你不能使用匿名类型作为返回类型,使得转换非常笨拙(需要帮助方法)等...
但这些并不是Anonymous Types的设计目的.在许多方面,它们被设计为在特定的定义函数中使用,并且随后创建lambda表达式.不是完全成熟的功能之间的数据通信类型.这肯定是设计的限制,有时会让我感到沮丧.但总的来说,我发现它们是语言中非常有用的结构.
如果没有它们,LINQ的许多部分都是不可能的.