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