2010-05-01 12 views
5

Supponiamo che ci sia una classe con una proprietà virtuale (chiamiamola 'P'). È sovrascritto in una classe derivante. Ora voglio usare qualcosa del genere: obj.GetType().GetProperty("P") per ottenere informazioni sulla proprietà prioritaria. Questa ricerca è ambigua, perché ci sono due proprietà "P" (base e override). Quindi ho digitato: obj.GetType().GetProperty("P", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)Riflettere classi derivate in C#

Restituisce solo la "P" prevalente, ma cosa succede se non riesco a indovinare in fase di compilazione se c'è un override a tutti? Quest'ultima chiamata restituirebbe null. Il caso è ancora più complicato, se la gerarchia dell'eredità è più grande.

In altre parole, voglio ottenere la sovrascrittura più "disponibile", altrimenti - la proprietà di base. Qual è il modo più pulito per raggiungere l'obiettivo? Solo uno che conosco al momento è di esaminare tutte le proprietà e controllare il nome e il tipo di dichiarazione.

risposta

3

Fondamentalmente, sono d'accordo con Martin: BindingFlags.FlattenHierarchy è probabilmente quello che ti serve. Tuttavia, penso che queste devono essere utilizzati al posto di BindingFlags.DeclaredOnly, vale a dire

Type type = obj.GetType(); 
var c = type.GetProperty("P", BindingFlags.FlattenHierarchy | 
           BindingFlags.Public | 
           BindingFlags.Instance); 

È quindi possibile utilizzare c.DeclaringType per scoprire a quale livello la proprietà è stata dichiarata.

Se si specifica DeclaredOnly e il tipo di type non dichiara (ma ereditano) P, null saranno restituiti.

+0

Sì, questo è ciò di cui avevo bisogno per far funzionare le cose. L'esempio di utilizzo che hai fornito è esattamente come dovrebbe essere fatto. Grazie! – pbalaga

1

Hai provato ad aggiungere BindingFlags.FlattenHierarchy?

+0

Grazie, questo è quello che mi serve. La descrizione di FlattenHierarchy su msdn mi sembrava fuorviante, quindi non ne ho tenuto conto. Dice di membri statici protetti, che non voglio eguagliare. Ora, dopo aver preparato un test rapido, posso vedere BindingFlags.Static | BindingFlags.NonPublic deve comunque specificare (in aggiunta) l'effetto con membri statici protetti. Grazie per aver sottolineato le cose che dovrebbero essere ovvie. – pbalaga

Problemi correlati