如何处理List <anonymoustype>的返回?</anonymoustype>

时间:2011-09-21 04:28:03

标签: c# linq anonymous-types

  

可能重复:
  LINQ to SQL: Return anonymous type?

这是我的代码:

 class B
    {
        public int age { get; set; }
        public string name { get; set; }
    }

    class Program
    {
        static List<whatshouldIwritehere> GetList()
        {
            List<B> list = new List<B>() {
                new B(){ age = 10, name = "jaagu" },
                new B(){ age = 20, name = "juggu" },
                new B(){ age = 30, name = "jockey" },
                new B(){ age = 40, name = "jaggu" },
            };

            return (from item in list
                select new { MyAge = item.age, MyName = item.name }).ToList();
        }

        static void Main(string[] args)
        {

            Console.Read();
        }
    }

有人能告诉我应该在函数GetList()的返回类型中写什么?我知道查询创建了一个匿名类,我希望跨函数使用该类。如果我使用MyAge和MyName创建一个自定义类,那么很容易在返回类型中给出它。但是,还有其他出路吗?如果这是相同的功能我会使用var关键字。但我不能在这里使用它。

4 个答案:

答案 0 :(得分:5)

您可以返回List<object>List<dynamic>

如果您返回object,那么除了反射之外,您将无法访问这些属性。 如果返回dynamic,则可以访问属性,但是会丢失编译时检查。 (因此输入属性名称的拼写错误会导致运行时异常。)

修改 您需要为ToList函数明确指定类型:

    static List<dynamic> GetList()
    {
        List<B> list = new List<B>() {
            new B(){ age = 10, name = "jaagu" },
            new B(){ age = 20, name = "juggu" },
            new B(){ age = 30, name = "jockey" },
            new B(){ age = 40, name = "jaggu" },
        };

        return (from item in list
                select new { MyAge = item.age, MyName = item.name }).ToList<dynamic>();
    }

答案 1 :(得分:1)

你可以这样做。重用B类而不是创建匿名类。

    static List<B> GetList() 
            { 
....
         return (from item in list 
                    select new B(){age = item.age, name = item.name }).ToList(); 
}

答案 2 :(得分:1)

坦率地说,如果您不想重用B,那么您应该定义一个新类型或使用另一个现有类型来保存您的数据(例如元组)。

匿名类型没有名称,并且您在编译时没有任何实际类型信息,因此您无法从函数返回它们。 “修补”您的方法以返回dynamicobject的列表就是一个补丁。对于两个选项,它总是不是最理想的,你将不得不求助于使用反射(直接和间接)。

答案 3 :(得分:0)

使用dynamicobject

As Peter mentioned,您可以使用objectdynamic。为此,请在调用ToList之前添加强制转换,以便指定要返回的列表类型:

return (from item in list
        select (dynamic)new { MyAge = item.age, MyName = item.name })
    .ToList();

或者:

return (from item in list
        select new { MyAge = item.age, MyName = item.name })
    .Cast<dynamic>()
    .ToList();

编辑:

实际上,他的ToList<dynamic>()更好。但继续阅读,我认为这仍然不是你给出的例子的好解决方案......

重复使用

相反,As Sandeep mentioned,您可以重复使用B

在我看来,这是正确的做法。您应遵循与面向对象编程一致的命名约定。对象的属性名称在它们是实例中立时最有意义,而“我的”不是实例中立的。

相反,请为您的实例命名 my

foreach(B my in GetList())
{
    Console.WriteLine(my.age);
    Console.WriteLine(my.name);
}