Ich habe folgende Möglichkeiten Werte in einer Liste abrufen:Leistung dynamische vs Reflexion
Reflexion mit:
foreach (var item in items) {
var property=item.Fields[fieldName].GetType().GetProperty("Id");
var value=property.GetValue(item.Fields[fieldName]);
if (value==searchValue) {
filtered.Add(item);
}
}
mit dynamisch:
foreach (var item in items) {
dynamic itemProperty=item.Fields[fieldName];
if (itemProperty.Id==searchValue) {
filtered.Add(item);
}
}
Beiden Schleifen das gleiche tun. Sie filtern IEnumerable (oder List) nach Field [fieldName], die verschiedenen Typen aber alle eine Int-Eigenschaft namens "Id" enthalten können.
Ich frage mich, was würde man eine bessere Leistung haben. Zusätzlich: Würde eine Änderung der LinQ-Abfrage die Performance erhöhen?
'dynamic' verwendet auch Reflektion, aber nicht auf so grobe Art und Weise wie in Ihrem ersten Beispiel. Also würde ich vermuten, dass Dynamik hier schneller sein wird. Natürlich hättest du das auch selbst messen können. – Evk
gibt es eine viel einfachere Möglichkeit, diese Art von Szenario zu nähern - fügen Sie eine 'Schnittstelle IHasId {int Id {get; }} 'und lassen Sie es von Ihren Typen implementieren (was wegen impliziter Schnittstellenimplementierungen normalerweise nur bedeutet,' 'IHasId' 'zu jedem hinzuzufügen) ... dann' foreach (IHasId-Element in Elementen) {if (item.Id == searchValue) { ...}} –
Warum probierst du es einfach nicht in einer großen Sammlung aus? Einfach * messen * es, z.B. Verwenden von 'StopWatch'. Und auch daran denken, nicht [vorzeitige Optimierung] (http://wiki.c2.com/?PrematureOptimization) zu tun. Sehen Sie sich auch https://stackoverflow.com/questions/4646786/dynamic-lang-runtime-vs-reflection an. – HimBromBeere