【问题标题】:Other than for LINQ queries, how do you use anonymous types in C#?除了 LINQ 查询,如何在 C# 中使用匿名类型?
【发布时间】:2008-10-03 18:10:40
【问题描述】:

我一直在努力了解 C# 中的一些新功能,其中一个我没有机会使用的功能是匿名类型。

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

对于匿名类型,您是否有一种新颖的用途,您认为它确实为您提供了一些实用性?

【问题讨论】:

    标签: c# anonymous-types


    【解决方案1】:

    稍加思考,就可以将匿名类型变成 Dictionary; 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 可能会提高可读性。

    【讨论】:

      【解决方案2】:

      ASP.NET MVC 路由在所有地方都使用这些对象。

      【讨论】:

        【解决方案3】:

        有时我怀疑执行类似于 LINQ 查询的操作可能很有用,但碰巧没有使用 LINQ - 但您仍然需要某种投影。我认为我不会将当前形式的匿名类型用于与 LINQ 投影完全不同的任何事情。

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

        再一次,我不认为我会经常使用它 - 但每隔一段时间这种能力就会很方便,尤其是在一个类的几个方法中。这可能是为 C# 5 中的不可变类型提供更多支持而做出的更大努力的一部分。

        【讨论】:

          【解决方案4】:

          补充一下Justice 所说的,ASP.Net MVC 是我第一次看到这些以有趣和有用的方式使用的地方。这是一个例子:

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

          ASP.Net MVC 使用像这样的匿名类型向 HTML 元素添加任意属性。我想你可以通过多种不同的方式来完成同样的事情,但我喜欢匿名类型的简洁风格,它给人一种动态语言的感觉。

          【讨论】:

            【解决方案5】:

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

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

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

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

            【讨论】:

              【解决方案6】:

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

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

              【讨论】:

                猜你喜欢
                • 2022-06-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-06-26
                相关资源
                最近更新 更多