2009-11-04 25 views
7

Ho un oggetto che ha un numero enorme di proprietà. Mi piacerebbe ottenere il valore di ciascuna di queste proprietà semplicemente eseguendo il ciclo attraverso la collezione di proprietà dell'oggetto.Ottieni valore proprietà dinamicamente

Ho esaminato il metodo PropertyInfo.GetValue() tuttavia non ha molto senso nel contesto che ho.

Ecco un esempio di quello che sto cercando di fare (questo codice non funziona btw):

foreach(var item in dataObjects) 
    { 
    foreach(PropertyInfo prop in item.GetType().GetProperties()) 
    { 
     String value = prop.GetValue().ToString() 
    } 
    } 

Mi rendo conto ora che ottenere il valore di una proprietà non è così facile. Cosa mi manca? Non ho veramente capito cosa devo passare al metodo GetValue() perché voglio semplicemente il valore della proprietà su cui sto chiamando quel metodo.

Grazie per qualsiasi aiuto chiarendo questo per me. Ho passato un paio d'ore qui a sbattere la testa contro la scrivania.

+2

Come si compila anche questo? – Tinister

+2

Non funziona. È un esempio di ciò che "voglio" fare, non di ciò che effettivamente fa il codice. :) –

risposta

10

è necessario fornire l'oggetto specifico sul quale si desidera chiamare la proprietà in questione:

prop.GetValue(item, null); 

Il PropertyInfo è solo metadata sulla proprietà del tipo, non sulla istanza di oggetto specifico. Il PropertyInfo non sa da quale istanza proviene (se esiste) - solo il tipo/classe da cui proviene.

Si può quasi pensare a PropertyInfo come solo il nome della proprietà. Non sono sufficienti informazioni per fare qualsiasi cosa con questo solo - dobbiamo quindi dire "ottenere il valore della proprietà con questo nome su ... cosa?" Sull'oggetto che forniamo.

3

PropertyInfo rappresenta il meccanismo di proprietà stesso (tipo, metodo get, metodo set, eccetera), non una proprietà associata a un'istanza specifica. Se la proprietà non è statica, è necessario fornire un'istanza per leggere tale proprietà da - questo è il primo parametro di GetValue. In altre parole, se pi è un PropertyInfo che rappresenta la proprietà Test su qualche classe ed someObject è un'istanza di tale classe:

object a = someObject.Test; 
object b = pi.GetValue(someObject, null); 

entrambe le linee là ottenere il valore della stessa proprietà sullo stesso oggetto. Se la proprietà è statica, non è necessario passare l'istanza, ovviamente (passa invece null). Il secondo parametro è l'indice per le proprietà indicizzate: C# non supporta le proprietà indicizzate (supporta gli indicizzatori, che non sono esattamente uguali), quindi probabilmente non dovrai mai passare nulla ma null per quel secondo parametro a meno che tu non stia funzionando con un certo tipo da un assembly scritto in una lingua che supporta le proprietà indicizzate (come VB, credo).

Problemi correlati