Pregunta

Estoy creando un método para tomar un ArrayList (probablemente lleno de objetos) y luego enumerar todos los campos (y sus valores) para cada objeto en el ArrayList.

Actualmente mi código es el siguiente:

public static void ListArrayListMembers(ArrayList list)
    {
        foreach (Object obj in list)
        {
            Type type = obj.GetType();
            string field = type.GetFields().ToString();
            Console.WriteLine(field);

        }
    }

Por supuesto, entiendo el problema inmediato con este código: si funcionara, solo se imprimiría un campo por objeto en la Lista de Array. Solucionaré esto más tarde, ahora mismo tengo curiosidad por saber cómo se asocian todos los campos públicos con un objeto.

¿Fue útil?

Solución

foreach (Object obj in list) {
    Type type = obj.GetType();

    foreach (var f in type.GetFields().Where(f => f.IsPublic)) {
        Console.WriteLine(
            String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj));
    }                           
}

Tenga en cuenta que este código requiere .NET 3.5 para funcionar ;-)

Otros consejos

Puede obtener todos los campos de objetos declarados directamente en la clase con BindingFlags:

GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)

y todos los campos de objeto, incluidos los heredados con:

GetFields(BindingFlags.Public | BindingFlags.Instance)
public static void ListArrayListMembers(ArrayList list)
{
    foreach (Object obj in list)
    {
        Type type = obj.GetType();
        Console.WriteLine("{0} -- ", type.Name);
        Console.WriteLine(" Properties: ");
        foreach (PropertyInfo prop in type.GetProperties())
        {
            Console.WriteLine("\t{0} {1} = {2}", prop.PropertyType.Name, 
                prop.Name, prop.GetValue(obj, null));
        }
        Console.WriteLine(" Fields: ");
        foreach (FieldInfo field in type.GetFields())
        {
            Console.WriteLine("\t{0} {1} = {2}", field.FieldType.Name, 
                field.Name, field.GetValue(obj));
        }
    }
}

Me gustaría mencionar que buscar IsPublic en los campos no es necesario como type.GetFields () como se define en MSDN afirma:

Valor de retorno - Escriba: System.Reflection.FieldInfo []

Una matriz de objetos FieldInfo que representan todos los campos públicos definidos para el Tipo actual.

Por supuesto, otra pregunta sería " ¿por qué tienes campos públicos? " - propiedades preferibles. Como una abstracción, tenga en cuenta que la reflexión no es la única opción: también es posible que un tipo exponga sus propiedades sobre la marcha en el tiempo de ejecución (por ejemplo, un DataView de DataTable / DataView expone las columnas como propiedades).

Para admitir esto (mientras que también admite objetos simples), debe usar TypeDescriptor :

        foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
        {
            Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
        }

Esto también permite numerosas opciones de extensibilidad, por ejemplo, ampliamente acelerando la reflexión (sin cambiar ningún código).

    static void ListArrayListMembers(ArrayList list)
    {
        foreach (object obj in list)
        {
            Type type = obj.GetType();
            foreach (FieldInfo field in type.GetFields(BindingFlags.Public))
            {
                Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString());
            }
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top