2010-10-26 12 views
6

Necesito hacer una función que obtenga todas las propiedades de un objeto (incluidos objetos secundarios) Esto es para mi función de registro de errores. Ahora mi código siempre devuelve 0 propiedades. Por favor, hágamelo saber lo que estoy haciendo mal, ¡gracias!Clase de reflexión para obtener todas las propiedades de cualquier objeto

public static string GetAllProperiesOfObject(object thisObject) 
{ 
    string result = string.Empty; 
    try 
    { 
     // get all public static properties of MyClass type 
     PropertyInfo[] propertyInfos; 
     propertyInfos = thisObject.GetType().GetProperties(BindingFlags.Public | BindingFlags.Static);//By default, it will return only public properties. 
     // sort properties by name 
     Array.Sort(propertyInfos, 
        (propertyInfo1, propertyInfo2) => propertyInfo1.Name.CompareTo(propertyInfo2.Name)); 

     // write property names 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("<hr />"); 
     foreach (PropertyInfo propertyInfo in propertyInfos) 
     { 
      sb.AppendFormat("Name: {0} | Value: {1} <br>", propertyInfo.Name, "Get Value"); 
     } 
     sb.Append("<hr />"); 
     result = sb.ToString(); 
    } 
    catch (Exception exception) 
    { 
     // to do log it 
    } 

    return result; 
} 

esto es lo que el objeto se parece a: alt text alt text

+0

Esos (IPAddress, MerchantSessionId, etc.) son propiedades, y no campos, ¿no? –

+0

Reed, no estoy seguro. Sin embargo, estoy interesado en obtener todos los campos y propiedades. Incluyendo cualquier sub-objeto. – aron

Respuesta

6

Si quieres todas las propiedades, intente:

propertyInfos = thisObject.GetType().GetProperties(
     BindingFlags.Public | BindingFlags.NonPublic // Get public and non-public 
    | BindingFlags.Static | BindingFlags.Instance // Get instance + static 
    | BindingFlags.FlattenHierarchy); // Search up the hierarchy 

Para más detalles, véase BindingFlags.

+0

Hola Reed, gracias. Añadí esto, pero todavía tengo 0 propiedades. Agregué imágenes a mis preguntas, mire arriba. ¡Gracias! – aron

0

Su matriz propertyInfos está regresando 0 longitud para una de mis clases. Cambiando la línea a ser

propertyInfos = thisObject.GetType().GetProperties(); 

Resultados en la población. Por lo tanto, esta línea de código es tu problema. Al parecer, si se agrega la bandera

BindingFlags.Instance 

a sus parámetros devolverá las mismas propiedades que la llamada sin parámetros. ¿Sume este parámetro a su lista para solucionar el problema?

EDIT: Acaba de ver su edición. Basado en el código que publicaste, tampoco funcionó para mí. Al agregar BindingFlags.Instance hice que devuelva propiedades para mí. Te sugiero que publiques el código exacto con el que estás teniendo problemas ya que tu captura de pantalla muestra un código diferente.

+0

hola, el código anterior es mi código actual. En la captura de pantalla probé la sugerencia de Reed Copsey. – aron

+0

¿Puedes probar el código en un objeto más simple para ver si funciona? Si no, ¿puedes publicar el código de la clase en la que lo estás probando? – mike

2

El problema con su código es que los tipos de respuesta de PayPal son miembros, NO propiedades. Pruebe:

MemberInfo[] memberInfos = 
    thisObject.GetMembers(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance); 
+2

Una nota aquí: un miembro es cualquier cosa, ya sea variable, método, evento o propiedad definida no estáticamente dentro de una clase. Las variables de miembros se llaman 'campos'. Por lo tanto, consulte los campos y las propiedades por separado o, alternativamente, consulte a todos los miembros y fíjelos a aquellos con un 'MemberType' de' MemberTypes.Field' o 'MemberType.Property'. –

Cuestiones relacionadas