在分析一些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之外完成任务的正确方法?它们是否会损害代码的可重用性和可读性?
答案 0 :(得分:5)
var list = New List<No way to specify an Ananymous type>();
通常你必须求助于辅助方法。
public List<T> CreateList<T>(T notUsed) {
return new List<T>();
}
var list = CreateList(new { .Class = "foo" });
这也有一个更大的影响,因为你不能使用匿名类型作为返回类型,使得转换非常笨拙(需要帮助方法)等...
但这些并不是Anonymous Types的设计目的。在许多方面,它们被设计为在特定的定义函数中使用,并且随后创建lambda表达式。不是完全成熟的功能之间的数据通信类型。这肯定是设计的限制,有时会让我感到沮丧。但总的来说,我发现它们是语言中非常有用的结构。
如果没有它们,LINQ的许多部分都是不可能的。
答案 1 :(得分:3)
当正在创建的对象是暂时性对象时,即它立即被消耗或转换为其他东西时,我喜欢匿名类型的想法。它可以防止您使用仅用作短期容器的单用途类来乱丢您的代码。您的示例是典型的使用类型,它们派上用场,即在帮助程序扩展中,它几乎总是立即转换为参数字典,并且json结果会被序列化。如果类具有域重要性或需要用作第一类对象,那么无论如何都要为它创建一个域类。
答案 2 :(得分:1)
我认为它们是构建字典的更好方法。特别是在你的样品中,有什么替代品?传递IDictionary&lt; String,Object&gt;?我认为匿名类型更具可读性。
答案 3 :(得分:0)
我同意
同样传递lambda和委托,而不是找到连贯的域级别的abstrations
答案 4 :(得分:0)
我经常使用它们来填充GridViews和DataGridViews,因为它节省了大量时间配置GridView以仅显示我感兴趣的列。
然而,除了设置DataSources之外,我认为它对可读性有害 - 好的抽象可能更好。