otra - recorrer una lista c#
c#foreach(propiedad en objeto)... ¿Existe una forma sencilla de hacer esto? (7)
Tengo una clase que contiene varias propiedades (todas son cadenas si hace alguna diferencia).
También tengo una lista, que contiene muchas instancias diferentes de la clase.
Al crear algunas pruebas unitarias para mis clases, decidí que quería recorrer cada objeto de la lista y luego recorrer cada propiedad de ese objeto ...
Pensé que hacer esto sería tan simple como ...
foreach (Object obj in theList)
{
foreach (Property theProperties in obj)
{
do some stufff!!;
}
}
¡Pero esto no funcionó! :( me sale este error ...
"la instrucción foreach no puede operar en variables de tipo ''Application.Object'' porque ''Application.Object'' no contiene una definición pública para ''GetEnumerator''"
¿Alguien sabe de una manera de hacer esto sin toneladas de ifs y bucles o sin entrar en algo demasiado complejo?
Casi llegas, solo necesitas obtener las propiedades del tipo, en lugar de esperar que las propiedades sean accesibles en forma de una colección o bolsa de propiedades:
var property in obj.GetType().GetProperties()
Desde allí se puede acceder así :
property.Name
property.GetValue(obj, null)
Con GetValue
el segundo parámetro le permitirá especificar valores de índice, que funcionarán con las propiedades que devuelven colecciones. Dado que una cadena es una colección de caracteres, también puede especificar un índice para devolver un carácter si es necesario.
Claro, no hay problema
foreach(object item in sequence)
{
if (item == null) continue;
foreach(PropertyInfo property in item.GetType().GetProperties())
{
// do something with the property
}
}
No pude conseguir ninguna de las formas anteriores de trabajar, pero esto funcionó. El nombre de usuario y la contraseña para DirectoryEntry son opcionales.
private List<string> getAnyDirectoryEntryPropertyValue(string userPrincipalName, string propertyToSearchFor)
{
List<string> returnValue = new List<string>();
try
{
int index = userPrincipalName.IndexOf("@");
string originatingServer = userPrincipalName.Remove(0, index + 1);
string path = "LDAP://" + originatingServer; //+ @"/" + distinguishedName;
DirectoryEntry objRootDSE = new DirectoryEntry(path, PSUsername, PSPassword);
var objSearcher = new System.DirectoryServices.DirectorySearcher(objRootDSE);
objSearcher.Filter = string.Format("(&(UserPrincipalName={0}))", userPrincipalName);
SearchResultCollection properties = objSearcher.FindAll();
ResultPropertyValueCollection resPropertyCollection = properties[0].Properties[propertyToSearchFor];
foreach (string resProperty in resPropertyCollection)
{
returnValue.Add(resProperty);
}
}
catch (Exception ex)
{
returnValue.Add(ex.Message);
throw;
}
return returnValue;
}
Prueba esto:
foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties())
{
// do stuff here
}
También tenga en cuenta que Type.GetProperties()
tiene una sobrecarga que acepta un conjunto de indicadores de enlace para que pueda filtrar propiedades en un criterio diferente como el nivel de accesibilidad, consulte MSDN para obtener más detalles: Método de Type.GetProperties (BindingFlags) Por último, pero no menos importante No se olvide de agregar la referencia de ensamblaje "system.Reflection".
Por ejemplo, para resolver todas las propiedades públicas:
foreach (var propertyInfo in obj.GetType()
.GetProperties(
BindingFlags.Public
| BindingFlags.Instance))
{
// do stuff here
}
Por favor, hágamelo saber si esto funciona como se esperaba.
Puede recorrer todas las propiedades no indexadas de un objeto como este:
var s = new MyObject();
foreach (var p in s.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any())) {
Console.WriteLine(p.GetValue(s, null));
}
Dado que GetProperties()
devuelve indexadores así como propiedades simples, necesita un filtro adicional antes de llamar a GetValue
para saber que es seguro pasar null
como segundo parámetro.
Es posible que deba modificar el filtro aún más para eliminar las propiedades de solo escritura y de otro modo inaccesibles.
Una pequeña palabra de advertencia, si "hacer algunas cosas" significa actualizar el valor de la propiedad real que visita Y si hay una propiedad de tipo estructura a lo largo de la ruta desde el objeto raíz a la propiedad visitada, el cambio que realizó en la propiedad No se reflejará en el objeto raíz.
Usa la reflexión para hacer esto
SomeClass A = SomeClass(...)
PropertyInfo[] properties = A.GetType().GetProperties();