Mein Antwort auf eine der Fragen zu SO wurde von Valentin Kuzub kommentiert, der argumentiert, dass das Inlining einer Eigenschaft durch den JIT-Compiler dazu führt, dass die Reflektion aufhört zu funktionieren.
Der Fall ist wie folgt:
%Vor% Fuzz
function akzeptiert einen Lambda-Ausdruck und verwendet Reflektion, um die Eigenschaft zu finden. Es ist eine gängige Praxis in MVC in HtmlHelper
Erweiterungen.
Ich denke nicht, dass die Reflektion aufhört zu funktionieren, selbst wenn die Bar
Eigenschaft inline wird, da es ein Aufruf von Bar
ist, der inline wird und typeof(Foo).GetProperty("Bar")
wird immer noch eine gültige PropertyInfo
zurückgeben.
Könnten Sie dies bitte bestätigen, oder ist mein Verständnis von Methodeninlining falsch?
Der JIT-Compiler arbeitet zur Laufzeit und kann Metadateninformationen, die in der Assembly gespeichert sind, nicht neu schreiben. Und Reflection liest Assembly, um auf diese Metadaten zuzugreifen. Es gibt also keine Auswirkungen von JIT-Compiler auf Reflexion.
BEARBEITEN: Tatsächlich gibt es einige Stellen, an denen der C # -Compiler selbst einige Informationen während der Kompilierung "einfügt". Zum Beispiel sind Konstanten, Enums und Standardargumente "inline", sodass Sie während der Reflektion nicht darauf zugreifen können. Aber es bezieht sich definitiv nicht auf Ihren speziellen Fall.
Ja, wenn ich darüber nachdenke, denke ich, dass nur dann, wenn die Eigenschaften von INotifyPropertyChanged korrekt sind, die korrekte Arbeit funktionieren würde, wenn Sie eine reflektionsbasierte Methode wie
verwenden würden %Vor%Bei Verwendung wie Sie vorschlagen, existieren tatsächlich Metadaten in der Assembly und der Name der Eigenschaft wird von dort erfolgreich übernommen.
Haben wir beide gedacht.
Ausdrucksbäume können sowieso nicht eingefügt werden, da sie eine Darstellung des Ausdrucks (abstrakter Syntaxbaum) und nicht des Ausdrucks selbst sind.
Delegierte können, selbst wenn sie eingegrenzt werden können, die Daten über die Methode und das Ziel, die in ihren Eigenschaften aufgerufen werden, weiterhin tragen.
Tags und Links c# reflection inlining