除了LINQ查询,你如何在C#中使用匿名类型?

时间:2008-10-03 18:10:40

标签: c# anonymous-types

我一直在努力加快C#中一些较新的功能,其中一个我没有使用过的是匿名类型。

我理解它与LINQ查询有关的用法,我看了this SO post,它提出了类似的问题。我在网上看到的大多数例子都与LINQ查询有关,这很酷。我也看到了一些有些人为的例子,但实际上并没有看到很多有价值的东西。

您认为匿名类型的新用途是否真的为您提供了一些实用工具?

6 个答案:

答案 0 :(得分:6)

通过一些反思,您可以将匿名类型转换为字典< string,object&gt ;; Roy Osherove在此博客论述了他的技巧:http://weblogs.asp.net/rosherove/archive/2008/03/11/turn-anonymous-types-into-idictionary-of-values.aspx

Jacob Carpenter使用匿名类型作为初始化不可变对象的方法,其语法类似于对象初始化:http://jacobcarpenter.wordpress.com/2007/11/19/named-parameters-part-2/

匿名类型可用作为使用foreach语句迭代的集合中的对象属性提供更易于读取的别名的方法。 (虽然,老实说,这只不过是使用LINQ to Objects的匿名类型的标准用法。)例如:

Dictionary<int, string> employees = new Dictionary<int, string>
{
    { 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循环更长,则引用IDName可能会提高可读性。

答案 1 :(得分:5)

ASP.NET MVC路由在整个地方使用这些对象。

答案 2 :(得分:3)

偶尔我怀疑执行某些喜欢 LINQ查询的东西可能有用,但是没有碰巧使用LINQ - 但你仍然需要某种投影。我认为我不会在当前形式中使用匿名类型来处理与LINQ投影完全不同的任何内容。

希望看到的一件事就是能够使用简单的声明创建“命名”类型,这将以与匿名类型相同的方式生成属性和构造函数,以及覆盖Equals / GetHashCode / ToString以相同(有用)的方式。当需要添加更多行为时,这些类型可以转换为“普通”类型。

同样,我认为我不会经常使用它 - 但是这种能力往往很方便,特别是在课堂的几种方法中。这可能是为C#5中不可变类型提供更多支持的更大努力的一部分。

答案 3 :(得分:3)

除了Justice所说的,ASP.Net MVC是我见过的第一个以有趣和有用的方式使用它们的地方。这是一个例子:


Html.ActionLink("A Link", "Resolve", new { onclick = "someJavascriptFn();" })

ASP.Net MVC使用这样的匿名类型向HTML元素添加任意属性。我想有很多不同的方法可以完成同样的事情,但我喜欢简洁类型的简洁风格,它给人的感觉更具动感。

答案 4 :(得分:2)

匿名类型的最大用途是LINQ,实际上这就是它被创建的原因。

我想在linq之外的匿名类型的一个原因是创建一个临时的类似结构的对象,例如:

var x = new { a = 1, b = 2 };

在某些情况下,这可能会让你的生活变得更轻松。

答案 5 :(得分:1)

我已经将它们用于制作模板化电子邮件,因为如果您使用反射和泛型,它们会非常棒。

有些信息可以在这里找到:http://www.aaron-powell.com/blog.aspx?id=1247