Eigenschafts- / Methodeninlining und Auswirkungen auf Reflection

9

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?

    
Jakub Konecki 14.07.2011, 10:34
quelle

4 Antworten

3

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.

    
Sergey Teplyakov 14.07.2011, 10:44
quelle
1

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.

    
Valentin Kuzub 14.07.2011 11:00
quelle
0

Ich stimme persönlich @Sergey zu:

Wenn man bedenkt, dass Inlining auf der Seite des JIT-Compilers stattfindet, aber zuvor generierte Metadaten, sollte es in keiner Weise zu Reflexionen führen. Übrigens, gute Frage, wie es +1

    
Tigran 14.07.2011 10:48
quelle
0

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.

    
Chris Chilvers 14.07.2011 11:22
quelle

Tags und Links