2012-02-20 21 views
21

Sto cercando di riflettere su alcune proprietà di classe e li programaticlly, ma sembra che uno dei miei filtri PropertyInfo non funziona:"metodo set Property non trovato" errore durante la riflessione

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter. 
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.SetProperty); 

I 'm ottenere un errore sulla linea

pi.SetValue(this, valueFromData, null); 

Poiché la proprietà ha solo un metodo get{}, nessun metodo set{}.

La mia domanda è: perché questa proprietà non è stata filtrata dagli oggetti di scena? Ho pensato che fosse lo scopo di BindingFlags.SetProperty.

La proprietà non sempre filtrato è:

public String CollTypeDescription 
    { 
     get { return _CollTypeDescription; } 
    } 

Nota che voglio filtrare le proprietà che non funzionano prima del tempo, perché io li sto messa in vendita in una volta. Io faccio non voglio usare pi.GetSetMethod() dopo il fatto per determinare se posso usare il setter.

+2

@dtryon - no - lui è O-ing insieme le bandiere per le opzioni che vuole impostare . –

risposta

51

Dalla documentazione:

BindingFlags.SetProperty

Specifica che il valore della proprietà specificata deve essere impostata. Per le proprietà COM , specificare questo flag di associazione è equivalente a che specifica PutDispProperty e PutRefDispProperty.

BindingFlags.SetProperty e BindingFlags.GetPropertyNon proprietà del filtro che mancano o setter getter, rispettivamente.

Per verificare se è possibile impostare una proprietà, utilizzare la proprietà CanWrite.

if (pi.CanWrite) 
    pi.SetValue(this, valueFromData, null); 
+0

Grazie per le informazioni - non posso usare CanWrite perché questo rivela solo i setter pubblici, e posso ancora fare uso di setter privati ​​dal momento che sto facendo questo all'interno della classe. – Alain

+0

@Alain - Sei sicuro? Ho appena fatto un test con una proprietà privata con un getter e setter. La proprietà CanWrite ha restituito true per quella proprietà privata. – ken

+0

incomprensione da parte mia. Hai ragione - i due sono intercambiabili e dal momento che il tuo metodo non richiede un test Null, è preferibile. – Alain

-1

Capisco la GetProperties() il metodo in modo che restituisca ogni proprietà che ha BindingFlags.GetPropertyoBindingFlags.SetProperty.
Quindi, se si desidera solo le proprietà che dispongono di setter, è necessario rimuovere il flag BindingFlags.GetProperty. Ma non l'ho testato, quindi potrei sbagliarmi.

La mia risposta ha ottenuto un -1. Quindi sembra che la mia risposta sia sbagliata.

2

Grazie a Ken per l'informazione. Sembra che la soluzione migliore che posso farlo per filtrare fuori testando GetSetMethod (vero) in un filtro LINQ:

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter. 
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(p => p.GetGetMethod(true) != null && p.GetSetMethod(true) != null).ToArray(); 
+0

Vedere il mio commento sulla mia risposta. CanWrite restituisce "true" per me per le proprietà private. Non funziona allo stesso modo per te? – ken

Problemi correlati