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%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%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.