Wie erhalte ich den Child-Deklarationstyp von einem Ausdruck?

8

Ich habe eine Parent / Child-Klassenhierarchie, in der das Parent eine String-Eigenschaft abstrahiert und die Child-Klasse es implementiert:

%Vor%

Wenn ich einen Ausdruck verwende, der die Child-Klasse explizit (oder implizit) verwendet, erwarte ich, dass der DeclaringType der Members von Expressions 'Child' ist, aber stattdessen ist Parent:

%Vor%

Die Assertion schlägt fehl, da der Deklarationstyp Übergeordnet ist.

Gibt es etwas, was ich tun kann, wenn ich meinen Ausdruck deklariere oder ihn konsumiere, um die tatsächliche Verwendung des Child-Typs zu offenbaren?

HINWEIS: GetMemberInfo () oben als eine Erweiterungsmethode (ich habe sogar vergessen, dass wir das geschrieben haben!):

%Vor%     
Trinition 27.02.2012, 14:23
quelle

3 Antworten

8

Nein - das ist eine genaue Darstellung dessen, was vom C # -Compiler ausgegeben wird. Die Überschreibung wird effektiv ignoriert, wenn nach dem Member gesucht wird - der Compiler kümmert sich nur um den Typ, der das Element ursprünglich deklariert hat . Sie können dies selbst sehen, indem Sie Code kompilieren und dann auf die IL schauen. Diese Methode:

%Vor%

ist in diesem IL kompiliert:

%Vor%

Ein Punkt der Trivialität: der VB-Compiler funktioniert nicht genauso, also diese Methode:

%Vor%

wird wie folgt kompiliert:

%Vor%     
Jon Skeet 27.02.2012, 14:24
quelle
3

Meine Lösung, basierend auf Informationen von @JonSkeet und @CodeInChaos, besteht darin, nicht nur die PropertyInfo im Ausdruck zu betrachten, sondern auch den Typ der Member-Komponente der MemberExpression:

%Vor%     
Trinition 27.02.2012 15:50
quelle
1

Wenn Sie nicht die Methode des statischen Typs, an der Sie arbeiten, verwenden möchten, sondern die letzte Überschreibung, dann ist das möglich. Ich habe nicht getestet, aber etwas ähnliches wie folgt sollte die Arbeit machen:

%Vor%

Dabei übergeben Sie MemberInfo als ersten Parameter und den Laufzeittyp des Objekts als zweiten Parameter. Beachten Sie, dass dies wahrscheinlich langsam ist, daher sollten Sie etwas Caching hinzufügen.

    
CodesInChaos 27.02.2012 15:02
quelle

Tags und Links