如何处理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关键字。 但我不能在这里使用它。
您可以返回List
或List
。
如果返回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
,那么您应该定义一个新类型或使用另一个现有类型来保存您的数据(例如元组)。
匿名类型没有名称,并且您在编译时没有任何实际类型信息,因此您无法从函数返回它们。 “修补”你的方法返回一个dynamic
或object
列表只是一个补丁。 对于两个选项,它总是不是最理想的,你将不得不求助于使用reflection(直接和间接)。
使用dynamic
或object
正如Peter所说 ,你可以使用object
或dynamic
。 为此,请在调用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); }