2009-09-19 16 views
37

Digamos que tengo muchos objetos y tienen muchas propiedades de cadena.Enumerando a través de las propiedades de un objeto (cadena) en C#

¿Hay alguna manera de programarlos y generar el nombre de propiedad y su valor o tiene que estar codificado?

¿Existe alguna forma de LINQ para consultar las propiedades de un objeto de tipo 'cadena' y darles salida?

¿Tiene que codificar los nombres de las propiedades que desea repetir?

Respuesta

70

Use la reflexión. No es tan rápido como el acceso a propiedades codificadas, pero hace lo que quiere.

La consulta siguiente genera un tipo anónimo con Nombre y Valor propiedades para cada propiedad de cadena tipificado en el objeto 'myObject':

var stringPropertyNamesAndValues = myObject.GetType() 
    .GetProperties() 
    .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null) 
    .Select(pi => new 
    { 
     Name = pi.Name, 
     Value = pi.GetGetMethod().Invoke(myObject, null) 
    }); 

Uso:

foreach (var pair in stringPropertyNamesAndValues) 
{ 
    Console.WriteLine("Name: {0}", pair.Name); 
    Console.WriteLine("Value: {0}", pair.Value); 
} 
+2

En lugar de pi.GetGetMethod() Invoke (myObject, null) Prefiero usar pi.GetValue (myObject, null) -. Sencillo de leer. – Sam

3

Usted puede utilizar la reflexión para hacer esto... . hay un artículo decente en CodeGuru, pero eso puede ser más de lo que estás buscando ... puedes aprender de él y luego ajustarlo a tus necesidades.

-2

¿Qué tal algo así?

public string Prop1 
{ 
    get { return dic["Prop1"]; } 
    set { dic["Prop1"] = value; } 
} 

public string Prop2 
{ 
    get { return dic["Prop2"]; } 
    set { dic["Prop2"] = value; } 
} 

private Dictionary<string, string> dic = new Dictionary<string, string>(); 
public IEnumerable<KeyValuePair<string, string>> AllProps 
{ 
    get { return dic.GetEnumerator(); } 
} 
11

Puede obtener todas las propiedades de un tipo utilizando el método GetProperties. A continuación, puede filtrar esta lista mediante el método de extensión LINQ Where. Finalmente puede proyectar las propiedades usando el método de extensión LINQ Select o un atajo conveniente como ToDictionary.

Si desea limitar la enumeración de las propiedades que tienen de tipo String puede utilizar este código:

IDictionary<String, String> = myObject.GetType() 
    .GetProperties() 
    .Where(p => p.CanRead && p.PropertyType == typeof(String)) 
    .ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null)); 

Esto creará un diccionario que mapea nombres de propiedad a los valores de propiedad. Como el tipo de propiedad está limitado a String, es seguro emitir el valor de la propiedad a String y el tipo del tipo devuelto es IDictionary<String, String>.

Si por el contrario desea que todas las propiedades que puede hacerlo de esta manera:

IDictionary<String, Object> = myObject.GetType() 
    .GetProperties() 
    .Where(p => p.CanRead) 
    .ToDictionary(p => p.Name, p => p.GetValue(myObject, null)); 
3

Si su objetivo es simplemente para dar salida a los datos almacenados en las propiedades del objeto utilizando un formato legible por humanos, prefiero simplemente serializar el objeto en formato JSON.

using System.Web.Script.Serialization; 
//... 

string output = new JavaScriptSerializer().Serialize(myObject); 
Cuestiones relacionadas