Ausschließen von Eigenschaften der Vaterklasse

7

Angenommen, ich habe die folgenden zwei Klassen.

%Vor%

Wie kann ich feststellen, ob eine bestimmte Eigenschaft eine Pater-Eigenschaft (Inherited) oder eine Child-Eigenschaft ist?

Ich habe es versucht

%Vor%

scheint aber, als ob "Ausgenommen" nicht die Gleichheit der Vatereigenschaften und der geerbten Eigenschaften von Child erkennt.

    
Yahya Hussein 02.01.2018, 12:03
quelle

4 Antworten

7

Probier es einfach so aus;

%Vor%     
lucky 02.01.2018, 12:10
quelle
7

Verwenden Sie die Überladung auf GetProperties , die BindingFlags . Fügen Sie das DeclaredOnly Flag neben den Public und Instance Flags ein und Sie sind fertig:

%Vor%

Dies wird eine Eigenschaft, den Namen, zurückgeben.

Beachten Sie, dass Sie mit dieser Lösung den Deklarationstyp nicht überprüfen müssen.

    
rene 02.01.2018 12:45
quelle
5

Untersuchen Sie DeclaringType Eigenschaft auf dem PropertyInfo . Das sollte Ihnen genug Informationen sagen.

    
Daniel A. White 02.01.2018 12:05
quelle
1

Wenn Sie nur die Eigenschaften, die von einer Klasse, aber nicht den geerbten Klassen definiert sind, möchten, können Sie das Bindungsflag BindingFlags.DeclaredOnly an die Methode GetProperties übergeben.

Ref: Ссылка

Bearbeiten 1:
Danke, dass Sie darauf hingewiesen haben, dass dies noch keine funktionierende Antwort ist.
Tatsächlich vergesse ich oft, diese obligatorischen Bindungsflaggen an GetXXX Methoden zu übergeben.
Und das Programm stürzt immer wie erwartet ab ...

Um die Methode trotzdem funktionieren zu lassen, sollte man immer 1) die Sichtbarkeit / Zugänglichkeit (dh öffentlich oder nicht) und 2) den Umfang (statisch / Instanz) der gewünschten Mitglieder angeben.
Wenn Sie das nicht tun, ist der Rückgabewert von GetXXX gleich null (oder ein leeres Array, da bin ich mir nicht ganz sicher, aber Sie bekommen die Idee.)

Abschließend, um die Dinge richtig zu machen, sollten Sie:
1. Wählen Sie aus BindingFlags.Public oder BindingFlags.NonPublic oder beides.
2. Wählen Sie aus BindingFlags.Instance oder BidningFlags.Static oder beides.
3. Kombinieren Sie die ausgewählten Flags aus den vorherigen Schritten mit BindingFlags.DeclaredOnly

In Ihrem Fall wird das Ergebnis die in der Antwort von Rene aufgeführte Zeile sein.
(Ich muss die Antwort bearbeiten, weil es scheint, dass ich noch nicht kommentieren kann ...)

    
YAC 02.01.2018 12:47
quelle