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