2010-08-02 9 views
28

Ho questo codice per ciclo attraverso un oggetto e ottenere tutte le sue proprietà attraverso la riflessione:Utilizzando la riflessione, come posso rilevare le proprietà che hanno setter.

foreach (var propertyInfo in typeof(TBase).GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
{ 
    var oldValue = propertyInfo.GetValue(oldVersion, null); 
} 

Come posso fare un controllo al solo guardare le proprietà che hanno un "set" su di loro? (Voglio ignorare valori di sola lettura -. Basta "Get")

+1

Non dimenticare gli oggetti con setter protette privati, protetti, interni, o interni .... quei sobillatori. –

+0

@ Dr.Wily'sApprentice puoi spiegarmi perché è necessario? (specialmente quelli privati) Voglio dire è possibile accedere a campi e proprietà private a causa della riflessione? - Wohh .. lo ha cercato ... è possibile. non ho detto niente – LuckyLikey

risposta

29

La mia risposta iniziale era corretta - Si prega di dare puntelli alla risposta di STO qui sotto:

propertyInfo.CanWrite (documentation)

o

propertyInfo.GetSetMethod (documentation)

+0

Questo mi sembra il metodo più pulito. – mpenrow

+2

Non credo che sia possibile utilizzare BindingFlags.SetProperty per richiedere proprietà con setter. Quel contrassegno può essere utilizzato quando si desidera eseguire un'azione che implica l'effettiva impostazione di una proprietà, ad esempio con il metodo Type.InvokeMember. –

+13

Questo non funziona. Usa entrambi i metodi proposti da STO qui sotto e assicurati di leggere il commento dell'apprendista del Dr. Wily riguardo alle differenze tra loro. – JonathanK

12
propertyInfo.GetSetMethod() != null 
71

PropertyInfo.CanWrite (documentation)

o

PropertyInfo.GetSetMethod (documentation)

+0

Questo funzionerà sicuramente, ma dovrai fare un controllo extra per ogni proprietà. Impostando BindingFlags.SetProperty potrai sempre recuperare solo le proprietà che contengono setter. –

+14

Si consiglia di utilizzare PropertyInfo.GetSetMethod e verificare se è null; il metodo PropertyInfo.CanWrite restituirà true se è presente un set privato, protetto o interno sulla proprietà. Restituirà false solo se in realtà non ci sono setter sulla proprietà. –

+0

Questo funziona perfettamente. – vtortola

Problemi correlati