如何处理List 的返回?

可能重复:
LINQ to SQL:返回匿名类型?

这是我的代码:

class B { public int age { get; set; } public string name { get; set; } } class Program { static List GetList() { List list = new List() { 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创建一个自定义类,那么很容易在返回类型中给出它。 但是,还有其他出路吗? 如果这个function相同,我会使用var关键字。 但我不能在这里使用它。

您可以返回ListList

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

编辑:您需要为ToList函数明确指定类型:

  static List GetList() { List list = new List() { 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(); } 

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

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

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

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

使用dynamicobject

正如Peter所说 ,你可以使用objectdynamic 。 为此,请在调用ToList之前添加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() .ToList(); 

编辑:

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

重复使用B.

相反, 正如Sandeep所提到的 ,你可以重复使用B

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

相反,将您的实例命名为:

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