Класс Reflection, чтобы получить все свойства любого объекта - PullRequest
6 голосов
/ 26 октября 2010

Мне нужно сделать функцию, которая получит все свойства объекта (включая дочерние объекты). Это для моей функции регистрации ошибок.Прямо сейчас мой код всегда возвращает 0 свойств.Пожалуйста, дайте мне знать, что я делаю неправильно, спасибо!

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;
}

вот как выглядит объект: alt text alt text

Ответы [ 3 ]

6 голосов
/ 26 октября 2010

Если вы хотите все свойства, попробуйте:

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

Подробнее см. BindingFlags .

2 голосов
/ 01 апреля 2011

Проблема с вашим кодом заключается в том, что типы ответов PayPal являются членами, а НЕ свойствами.Попробуйте:

MemberInfo[] memberInfos = 
    thisObject.GetMembers(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
0 голосов
/ 26 октября 2010

Ваш массив propertyInfos возвращает длину 0 для одного из моих классов. Изменение строки на

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

Результатом является заполнение. Поэтому эта строка кода - ваша проблема. Появляется, если вы добавите флаг

BindingFlags.Instance

вашим параметрам он вернет те же свойства, что и вызов без параметров. Устраняет ли проблему добавление этого параметра в ваш список?

РЕДАКТИРОВАТЬ: Только что увидел ваше редактирование. Судя по написанному вами коду, у меня это тоже не сработало. Добавление BindingFlags.Instance заставило его вернуть мне свойства. Я бы предложил опубликовать точный код, с которым у вас возникли проблемы, поскольку на скриншоте показан другой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...