除了LINQ查询,你如何在C#中使用匿名类型?
我一直在努力加快C#中一些较新的function,其中一个我没有用过的是匿名类型。
我理解它与LINQ查询有关的用法,我查看了这个SOpost ,它提出了类似的问题。 我在网上看到的大多数例子都与LINQ查询有关,这很酷。 我看到了一些有些人为的例子,但实际上并没有看到很多有价值的东西。
您是否对匿名类型有一种新颖的用途,您认为它真的为您提供了一些实用工具?
通过一些reflection,您可以将匿名类型转换为Dictionary
Jacob Carpenter使用匿名类型作为初始化不可变对象的方法,其语法类似于对象初始化: http : //jacobcarpenter.wordpress.com/2007/11/19/named-parameters-part-2/
匿名类型可用作为使用foreach
语句迭代的集合中的对象属性提供更易于读取的别名的方法。 (虽然,老实说,这只不过是LINQ to Objects的匿名类型的标准用法。)例如:
Dictionary employees = new Dictionary { { 1, "Bob" }, { 2, "Alice" }, { 3, "Fred" }, }; // standard iteration foreach (var pair in employees) Console.WriteLine("ID: {0}, Name: {1}", pair.Key, pair.Value); // alias Key/Value as ID/Name foreach (var emp in employees.Select(p => new { ID = p.Key, Name = p.Value })) Console.WriteLine("ID: {0}, Name: {1}", emp.ID, emp.Name);
虽然这个简短的样本没有太大的改进,但如果foreach
循环更长,那么引用ID
和Name
可能会提高可读性。
ASP.NET MVC路由使用这些对象。
偶尔我怀疑执行类似 LINQ查询的东西可能有用,但是没有碰巧使用LINQ – 但你仍然需要某种投影。 我认为我不会在当前forms中使用匿名类型来处理与LINQ投影完全不同的任何内容。
我希望看到的一件事是能够使用简单的声明创建“命名”类型,它将以与匿名类型相同的方式生成属性和构造函数,以及重写相同的Equals / GetHashCode / ToString(有用) ) 办法。 然后,当需要添加更多行为时,可以将这些类型转换为“正常”类型。
同样,我认为我不会经常使用它 – 但是这种能力往往很方便,特别是在课堂的几种方法中。 这可能是为C#5中不可变类型提供更多支持的更大努力的一部分。
为了增加Justice所说的,ASP.Net MVC是我见过的第一个以有趣和有用的方式使用它们的地方。 这是一个例子:
Html.ActionLink("A Link", "Resolve", new { onclick = "someJavascriptFn();" })
ASP.Net MVC使用这样的匿名类型向HTML元素添加任意属性。 我想有许多不同的方法可以完成同样的事情,但我喜欢简洁类型的简洁风格,它给了更多动态的语言感觉。
LINQ的最大用途是LINQ,实际上就是它的创建原因。
我想在linq之外的匿名类型的一个原因是创建一个临时的类似结构的对象,例如:
var x = new { a = 1, b = 2 };
在某些情况下,这可能会让您的生活更轻松一些。
我已经用它们来制作模板化的电子邮件,因为如果你使用reflection和generics,它们就很棒。
有些信息可以在这里找到: http : //www.aaron-powell.com/blog.aspx?id = 1247