嗯,DoIt
不知道result
有一个名为ShortName
的属性,因为它的类型为object
。您可以创建一个具体的类来保存结果,使用反射或使用dynamic
。请注意,无论哪种方式,GetData
确实会返回IEnumerable<T>
,其中T
目前是匿名类型。
使用具体类:
public class Foo {
public string ShortName { get; set; }
public int SCount { get; set; }
public string DisplayText { get; set; }
}
public IEnumerable<Foo> GetData() {
var table = GetDataTable();
var view = table.DefaultView;
//..... more code
var query = from row in view.ToTable().AsEnumerable()
group row by row.Field<string>("ShortName") into grouping
select new Foo
{
ShortName = grouping.Key,
SCount = grouping.Sum(count => count.Field<int>("ProfCount")),
DisplayText = string.Empty
};
return query;
}
public void DoIt() {
var result = GetData();
foreach(var item in result) {
Console.WriteLine(item.ShortName);
}
}
使用反射:
public IEnumerable GetData() {
var table = GetDataTable();
var view = table.DefaultView;
//..... more code
var query = from row in view.ToTable().AsEnumerable()
group row by row.Field<string>("ShortName") into grouping
select new Foo
{
ShortName = grouping.Key,
SCount = grouping.Sum(count => count.Field<int>("ProfCount")),
DisplayText = string.Empty
};
return query;
}
public void DoIt() {
var result = GetData();
PropertyInfo property = result.First().GetType().GetProperty("ShortName");
foreach(var item in result) {
string shortName = property.GetValue(item, null);
Console.WriteLine(shortName);
}
}
可以使用现有的类型吗?我宁愿在这里使用数据列。 – 2010-11-17 17:54:24
您绝对可以使用现有的类型。你不能在局部范围外使用匿名类型。你只需要一个公开可见的类型,因为你从公共方法返回它。 (如果方法是私有的,显式类型可以是私有嵌套类。) – 2010-11-17 17:56:07
@James Kovacs:“你不能在局部范围外使用匿名类型。”这是错误的(是的,MSDN上有这样的错误陈述)。 – jason 2010-11-17 18:02:55