2009-11-04 17 views
7

Tengo un objeto que tiene un gran número de propiedades. Me gustaría obtener el valor de cada una de esas propiedades simplemente recorriendo la colección de propiedades del objeto.Obtener valor de propiedad dinámicamente

He investigado el método PropertyInfo.GetValue() sin embargo, no tiene mucho sentido en el contexto que tengo.

He aquí un ejemplo de lo que estoy tratando de hacer (este código no funciona por cierto):

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

Ahora me doy cuenta de que conseguir el valor de una propiedad no es tan fácil. ¿Qué me estoy perdiendo? Realmente no entiendo lo que necesito pasar al método GetValue() porque simplemente quiero el valor de la propiedad en la que estoy llamando ese método.

Gracias por cualquier ayuda aclarando esto para mí. He pasado un par de horas aquí solo golpeando mi cabeza contra el escritorio.

+2

¿Cómo se compila esto? – Tinister

+2

No es así. Es un ejemplo de lo que "quiero" hacer, no de lo que realmente hace el código. :) –

Respuesta

10

es necesario proporcionar el objeto específico en el que desea llamar a la propiedad en cuestión:

prop.GetValue(item, null); 

El PropertyInfo es sólo metatdata sobre la propiedad del tipo, no en la instancia de objeto específico. PropertyInfo no sabe de qué instancia proviene (si corresponde), solo el tipo/clase de la que proviene.

Casi se puede pensar en PropertyInfo como el nombre de la propiedad. No es suficiente información para hacer algo solo: debemos decir "obtener el valor de la propiedad con este nombre en ... ¿qué?" En el objeto que proporcionamos.

3

PropertyInfo representa la propia maquinaria de la propiedad (tipo, método de obtención, método de configuración, etc.), no una propiedad vinculada a una instancia específica. Si la propiedad no es estática, debe proporcionar una instancia para leer esa propiedad: ese es el primer parámetro para GetValue. En otras palabras, si pi es un PropertyInfo que representa la propiedad Test en alguna clase y someObject es una instancia de esa clase:

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

ambas líneas allí obtienen el valor de la misma propiedad en el mismo objeto. Si la propiedad es estática, no es necesario que pase la instancia, obviamente (pase el nulo en su lugar). El segundo parámetro es el índice de propiedades indexadas: C# no admite propiedades indexadas (admite indexadores, que no son exactamente iguales), por lo que probablemente nunca tendrá que pasar nada más que null para ese segundo parámetro a menos que esté trabajando con algún tipo de ensamblaje escrito en un lenguaje que admite propiedades indexadas (como VB, creo).

Cuestiones relacionadas