Enumerando a través de las propiedades de un objeto (cadena) en C #

Digamos que tengo muchos objetos y tienen muchas propiedades de cadena.

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

¿Existe tal vez una forma 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?

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

La siguiente consulta genera un tipo anónimo con propiedades de Nombre y Valor para cada propiedad de tipo cadena 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); } 

Puede obtener todas las propiedades de un tipo mediante el método GetProperties . A continuación, puede filtrar esta lista utilizando 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 a las propiedades que tienen de tipo String , puede usar este código:

 IDictionary = 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 correlaciona los nombres de las propiedades con los valores de las propiedades. Como el tipo de propiedad está limitado a String , es seguro convertir el valor de la propiedad a String y el tipo del tipo devuelto es IDictionary .

Si en cambio quieres todas las propiedades, puedes hacerlo así:

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

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

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

 using System.Web.Script.Serialization; //... string output = new JavaScriptSerializer().Serialize(myObject); 

¿Qué tal algo como esto?

 public string Prop1 { get { return dic["Prop1"]; } set { dic["Prop1"] = value; } } public string Prop2 { get { return dic["Prop2"]; } set { dic["Prop2"] = value; } } private Dictionary dic = new Dictionary(); public IEnumerable> AllProps { get { return dic.GetEnumerator(); } }