Wenn ich diese Eigenschaft in einer abstrakten Klasse habe:
%Vor%Dann wenn ich rufe:
%Vor%Wenn p ein PropertyInfo-Objekt ist, das auf meine Eigenschaft verweist, bekomme ich null.
Wenn ich jedoch den Property-Setter zu protected ändere, kann ich ihn über Reflektion sehen. Warum ist das? Ich kann mich nicht erinnern, dieses Problem mit nicht abstrakten Klassen zu haben ...
Ich nehme an, dass Sie dies für ein Objekt von einem abgeleiteten Typ Ihrer abstrakten Klasse aufrufen. In dieser Klasse gibt es keinen Eigenschaften-Setter. Es befindet sich nur auf Ihrer abstrakten Basis. Deshalb funktioniert es, wenn Sie es als protected
markieren. Sie müssen stattdessen Ihre abstrakte Klasse ' Type
' verwenden, wenn Sie den Property Setter erhalten.
Es ist ein alter Thread, aber ich stoße in letzter Zeit auf ein ähnliches Problem und keines der oben genannten Dinge funktionierte für mich. Hinzufügen meiner Lösung, wie es für andere nützlich sein kann.
Wie bereits erwähnt, existiert der Setter einer Eigenschaft nicht in der geerbten Klasse. Was für mich funktionierte, war eine Stufe tiefer zu gehen mit DeclaringType
der PropertyInfo
So würde der Code zum Abrufen der Eigenschaft mit dem Setter wie folgt aussehen:
%Vor% In diesem Fall enthält propertyInfo
einen Wert für SetMethod
, so dass Sie den Wert mithilfe der Reflektion festlegen können.
Einige kurze Experimente im interaktiven C # -Webfenster legen nahe, dass für eine Eigenschaft P
, die für eine Klasse A
deklariert wurde, Folgendes gut funktioniert:
Aber sobald Sie dasselbe mit einer Unterklasse von A
versuchen, löst GetSetMethod
nicht mehr den privaten set
-Administrator auf:
Mit anderen Worten, das, was Sie versucht haben, funktioniert anscheinend nur für private
accessors, wenn der reflektierte Typ dem Deklarationstyp der Eigenschaft entspricht.
Der Trick besteht darin, die BindingFlags Enumeration, um anzugeben, dass private Member eingeschlossen werden sollen, wenn Sie das PropertyInfo
-Objekt erhalten:
Aufbauend auf der Arbeit von @piotrwolkowski
%Vor%Ich habe die verbindlichen Flags für meinen Anwendungsfall sowohl öffentlich als auch nicht-öffentlich hinzugefügt (es kann übertrieben sein und ich habe keine Zeit, es weiter zu verfolgen)
Ich habe die Instanz eines Objekts gesetzt, das von einer abstrakten Basis mit public get und private set
geerbt hatNochmals, alle Ehre für @piotrwolkowski
Das folgende Experiment hat das Problem für mich aufgedeckt. Beachten Sie, dass die Basisklasse nicht abstract
sein muss, um das Problem zu reproduzieren.
Was ich daraus gelernt habe und überraschend fand, ist, dass das PropertyInfo
des abgeleiteten Typs eine andere Instanz ist als das PropertyInfo
des Basistyps. Seltsam!
Tags und Links .net c# reflection