【问题标题】:Real World Example for Anonymous Types of C# .NETC# .NET 匿名类型的真实示例
【发布时间】:2023-04-09 12:49:01
【问题描述】:

我正在学习 C# 中的匿名类型,我已经了解它们是如何定义和使用的。下面是我为匿名类型尝试过的示例代码。

var myType = new {
Name = "Yasser",
City = "Mumbai"
};
Console.WriteLine("Name: {0}, Type: {1}", myType.Name, myType.City);

我的问题

在现实世界的场景中,这些会被使用吗?谁能给我一个可以使用这些匿名类型的示例或场景。

【问题讨论】:

标签: c# .net


【解决方案1】:

LINQ 查询经常使用它们:

var productQuery = 
    from prod in products
    select new { prod.Color, prod.Price };

{ prod.Color, prod.Price } 是一种匿名类型,具有只读的ColorPrice 属性。如果您要遍历该查询的结果,则可以将该类型用作任何其他类:

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

换句话说,您不必定义一个看起来像这样的新类:

public class ColoredPricedItem
{
    public Color {get;}
    public Price {get;}
}

更重要的是,ColorPrice 类型可以从您的查询中正确推断出来。

【讨论】:

    【解决方案2】:

    假设你有这样的课程:

    class User
    {
        public int ID;
        public string FirstName;
        public string LastName;
        public int Age;
        public string City;
        public string Country;
    }
    

    然后您创建了一个通用列表,其中 T 是用户类。您创建 n 个用户。 关键是,您不想在某些查询中显示所有字段(或属性),而只想显示一个人和该人居住的城市的名字 + 姓氏(作为一个)。 所以你在 Linq 中使用了一个新的关键字(我将展示如何使用 Linq 的 don 表示法):

            List<User> users = new List<User>();
            users.Add(new User { ID = 1, FirstName = "first 1", LastName = "last 1", Age = 32, City = "City 1", Country = "Country 1" });
            users.Add(new User { ID = 2, FirstName = "first 2", LastName = "last 2", Age = 33, City = "City 2", Country = "Country 2" });
            users.Add(new User { ID = 3, FirstName = "first 3", LastName = "last 3", Age = 34, City = "City 3", Country = "Country 3" });
    
            var query = users.Select(s => new
                {
                    FIRST_LAST = string.Format("{0} {1}", s.FirstName, s.LastName),
                    LIVING_IN = s.City
                }).ToList();
            foreach (var person in query)
            {
                string name = person.FIRST_LAST;
                string city = person.LIVING_IN;
            }
    

    希望对你有帮助, 再见

    【讨论】:

      【解决方案3】:

      除了在 Linq 中使用之外,它们还被 asp.net MVC 应用程序使用 在 Global.asax.cs 中映射路线

        routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
      

      【讨论】:

        【解决方案4】:

        一些 web 框架使用它们来表示 HTML 标签属性:

        var t = new Table(new { align="left", bgcolor="red", cellpadding="2" });
        

        【讨论】:

          【解决方案5】:

          在 C# 3 中为 LINQ 添加了匿名类型。当您只需要数据库中的一些属性时,它们非常有用,例如http://msdn.microsoft.com/en-us/library/bb397696.aspx

          var productQuery = from prod in products select new { prod.Color, prod.Price }; foreach (var v in productQuery) { Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price); }

          这只会从数据库中获取颜色和价格列:)

          【讨论】:

            【解决方案6】:

            您可以使用它来生成 html 元素。

            下面的示例使用方法“el”来生成具有给定属性和innerHTML 的html 元素。参数“params object[] objects”允许给出任意数量的匿名对象来定义所需的html属性。

            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Text;
            using System.Reflection;
            namespace anonymousTypes
            {
                class Program
                {
                    static void Main(string[] args)
                    {
            
                        el("td", null, new { colspan = 36 }, new { style = "text-align: center;" });
                        Console.Read();
                    }
            
                    static string el(string tagName, string innerHTML, params object[] objects)
                    {
                        StringBuilder b = new StringBuilder();
                        b.Append("<").Append(tagName);
                        foreach (object obj in objects)
                        {
                            foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties())
                            {
                                Console.Write(propertyInfo.Name + " | " + propertyInfo.GetValue(obj, null) + "\n");
                            }
                        }
                        b.Append(">");
                        if (innerHTML != null)
                            b.Append(innerHTML);
                        b.Append("</").Append(tagName).Append(">");
                        return b.ToString();
                    }
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-01-16
              • 1970-01-01
              • 2015-01-22
              • 2015-05-02
              • 1970-01-01
              • 1970-01-01
              • 2011-01-19
              相关资源
              最近更新 更多