2011-08-31 14 views
10

Eventuali duplicati:
How do I detect the "new" modifer on a field using reflection?Come determinare se un campo ha un modificatore 'nuovo' tramite riflessione?

Avere la seguente dichiarazione

public class B : A 
{ 
    public new string Name; 
} 

come faccio a determinare se il campo ha 'nuova' modificatore per la sua FieldInfo esempio?

+4

non dovresti davvero esporre campi come questo ... usa invece una proprietà. –

+1

anche tu dovresti semplicemente impostare il valore, non creare un nuovo riferimento. –

+1

@Daniel: nuovo in questo caso significa non utilizzare quello nella classe base –

risposta

5

Penso che dovrai cercare la gerarchia delle classi di base per un membro con lo stesso nome, e se non lo è, allora è nuovo.

so che è brutto, ma come per il commento su quest'altra risposta alla stessa domanda How do I detect the "new" modifer on a field using reflection?, si dice:

ho preso uno sguardo al codice sorgente di ILSpy, stanno facendo la stessa cosa - camminare la catena ereditaria. Stanno usando Mono.Cecil, ma c'è nessuna informazione speciale che non è disponibile tramite riflessione. Per ulteriori informazioni su , dai un'occhiata al metodo AstBuilder.SetNewModifier di ILSpy.

Probabilmente non è quello che ti aspettavi, mi dispiace per quello.

+1

Sì, mi aspettavo qualcosa come FieldInfo.IsNew ma la tua soluzione suona come una strada da percorrere. Grazie! – UserControl

8

Per i campi, non esiste; l'IL è semplicemente:

.field public string Name 

ecc - dal momento che non esiste il concetto di campi virtuali o newslot ecc Il modificatore new qui esiste puramente per il compilatore, per affermare che si riconosce si sta facendo qualcosa un po 'di confusione. L'aggiunta di new qui sopprimerà un avviso del compilatore (CS0108), ma non modifica l'IL. Pertanto, non è possibile distinguere tra un camponew d da un campo rispetto a un campo che è stato nascosto senza new.

Sarebbe preferibile, tuttavia, se ci si limita a campi privati ​​con proprietà pubbliche di accesso. E si noti che in entrambi i casi: il campo nel tipo di base esiste ancora.

Problemi correlati