Eh bien, DoIt
n'a aucune idée que result
a une propriété nommée ShortName
car il est tapé comme object
. Vous pouvez créer une classe concrète qui contient les résultats, utiliser la réflexion ou utiliser dynamic
. Notez que de toute façon, GetData
renvoie vraiment un IEnumerable<T>
où T
est actuellement un type anonyme.
En utilisant une classe concrète:
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);
}
}
utilisant la réflexion:
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);
}
}
Peut-on utiliser un type existant? Je préfère utiliser un datarow ici. –
Vous pouvez absolument utiliser un type existant. Vous ne pouvez pas utiliser un type anonyme en dehors de la portée locale. Vous avez juste besoin d'un type qui est publiquement visible parce que vous le renvoyez d'une méthode publique. (Le type explicite pourrait être une classe imbriquée privée si la méthode était privée.) –
@James Kovacs: "Vous ne pouvez pas utiliser un type anonyme en dehors de la portée locale." C'est faux (oui, il y a des instructions incorrectes sur MSDN à cet effet). – jason