Ist es möglich, eine Erweiterungsmethode zu erstellen, um eine einzelne Eigenschaft oder ein einzelnes Feld in einer Objektliste zurückzugeben?Wie wird eine einzelne Eigenschaft in einer Liste von Objekten gesammelt?
Derzeit habe ich viele Funktionen wie folgt.
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;
}
Dies ist "hart codiert" und dient nur einer einzigen Eigenschaft in einem einzigen Objekttyp. Es ist mühsam und ich bin mir sicher, dass es eine Möglichkeit gibt, LINQ/Reflection zu verwenden, um eine Erweiterungsmethode zu erstellen, die dies generisch und wiederverwendbar macht. Etwas wie folgt aus:
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;
}
Neben der einfachste Methode, mit LINQ, ich bin auch für die schnellste Methode suchen. Ist es möglich, Code-Generierung (und Lambda-Ausdruck-Bäume) zu verwenden, um eine solche Methode zur Laufzeit zu erstellen? Ich bin mir sicher, dass das schneller wäre als Reflection.
Ihre Funktion könnte geschrieben werden als "motions.Select (motion => motion.Speed)". Das ist nicht ganz allgemein, aber für den Anfang ist es viel kürzer als jedes Mal eine Methode zu schreiben und aufzurufen. – nvoigt
Nur der Aufruf meiner Methode ist möglicherweise schneller. (LINQ ist normalerweise langsamer als nicht-generischer Code) –