È possibile creare un metodo di estensione per restituire una singola proprietà o un campo in un elenco di oggetti?Come raccogliere una singola proprietà in un elenco di oggetti?
Attualmente ho molte funzioni come la seguente.
public static List<int> GetSpeeds(this List<ObjectMotion> motions) {
List<int> speeds = new List<int>();
foreach (ObjectMotion motion in motions) {
speeds.Add(motion.Speed);
}
return speeds;
}
Questa è "hard coded" e serve solo una singola proprietà in un unico tipo di oggetto. È noioso e sono sicuro che c'è un modo per usare LINQ/Reflection per creare un metodo di estensione che possa farlo in modo generico e riutilizzabile. Qualcosa di simile a questo:
public static List<TProp> GetProperties<T, TProp>(this List<T> objects, Property prop){
List<TProp> props = new List<TProp>();
foreach (ObjectMotion obj in objects) {
props.Add(obj.prop??);
}
return props;
}
A parte il metodo più semplice utilizzando LINQ, sto anche cercando il metodo più veloce. È possibile utilizzare la generazione di codice (e gli alberi di espressione Lambda) per creare un tale metodo in fase di runtime? Sono sicuro che sarebbe più veloce dell'utilizzo di Reflection.
La funzione potrebbe essere scritta come "motions.Select (motion => motion.Speed)". Questo non è esattamente generico, ma per cominciare è molto più breve di scrivere e chiamare un metodo ogni volta. – nvoigt
Solo chiamare il mio metodo potrebbe essere più veloce. (LINQ è di solito più lento del codice non generico) –