Reflection kann den privaten Setter für die Eigenschaft der abstrakten Klasse nicht finden

8

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

    
ekolis 24.12.2013, 16:12
quelle

6 Antworten

6

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.

    
TyCobb 24.12.2013, 16:21
quelle
5

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.

    
PiotrWolkowski 17.06.2016 18:58
quelle
3

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:

%Vor%

Aber sobald Sie dasselbe mit einer Unterklasse von A versuchen, löst GetSetMethod nicht mehr den privaten set -Administrator auf:

%Vor%

Mit anderen Worten, das, was Sie versucht haben, funktioniert anscheinend nur für private accessors, wenn der reflektierte Typ dem Deklarationstyp der Eigenschaft entspricht.

    
Mike Strobel 24.12.2013 16:30
quelle
1

Der Trick besteht darin, die BindingFlags Enumeration, um anzugeben, dass private Member eingeschlossen werden sollen, wenn Sie das PropertyInfo -Objekt erhalten:

%Vor%     
Mike Dinescu 24.12.2013 16:15
quelle
0

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 hat

Nochmals, alle Ehre für @piotrwolkowski

    
Adam Straughan 13.07.2017 06:47
quelle
0

Das folgende Experiment hat das Problem für mich aufgedeckt. Beachten Sie, dass die Basisklasse nicht abstract sein muss, um das Problem zu reproduzieren.

%Vor%

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!

    
HappyNomad 09.10.2017 23:15
quelle

Tags und Links