Нахождение всех свойств и свойств объекта - PullRequest
3 голосов
/ 11 мая 2011

Иногда я хочу знать, есть ли у объекта свойство, которое я ищу, но иногда у объекта много свойств, и может потребоваться некоторое время, чтобы найти его для отладки.Было бы хорошо, если бы я мог написать функцию, которая найдет все свойства и ее значения в строке, тогда я могу вставить эту строку, например, в блокнот и найти нужное значение с помощью функции поиска, которая есть в блокноте.Пока у меня есть что-то вроде этого:

public void getAllPropertiesAndSubProperties(System.Reflection.PropertyInfo[] properties)
        {
            foreach (var a in properties)
            {
                //MessageBox.Show(a.ToString());
                // do something here to test if property a is the one 
                // I am looking for
                System.Reflection.PropertyInfo[] temp = a.GetType().GetProperties();
                // if property a has properties then call the function again
                if (temp.Length > 0) getAllPropertiesAndSubProperties(temp);
            }
        }

Редактирование вопроса, над которым я работал:

До сих пор я добавил следующий код.Я могу передать любой объект, который я хочу, в следующий метод, и я могу видеть все свойства.У меня возникают проблемы при просмотре значений свойств

![public void stackOverex(dynamic obj)
{
    // this is the string where I am apending all properties
    string stringProperties = "";

    Type t = obj.GetType();
    List<PropertyInfo> l = new List<PropertyInfo>();
    while (t != typeof(object))
    {
        l.AddRange(t.GetProperties());
        t = t.BaseType;

        var properites = t.GetType().GetProperties();
        foreach (var p in properites)
        {
            string val = "";
            try
            {
                val = obj.GetType().GetProperty(p.Name).GetValue(obj, null).ToString();
            }
            catch
            {

            }
            stringProperties += p.Name + " - " + val + "\r\n";
        }

    }

    MessageBox.Show(stringProperties);
}

enter image description here

Да, отладчик Visual Studio великолепен, но посмотрите, сколько свойств может иметь объект.Я на самом деле ищу свойство indexSomething gridViewColumnHeader. Я не помню точное имя, я просто помню, я использовал его раньше.У меня есть событие, которое срабатывает при нажатии на столбец, и я хотел бы знать индекс, а не имя «столбец номер 2? Или 3 был нажат».Я знаю, что могу получить его с именем, но было бы хорошо, если бы я мог реализовать эту функцию отладчика.Посмотрите, как это сложно, на картинке ниже.

enter image description here

1 Ответ

6 голосов
/ 11 мая 2011

Если вы хотите, чтобы все свойства, включая базовый тип, вы могли бы сделать это:

        Type t = typeof(AnyType);
        List<PropertyInfo> l = new List<PropertyInfo>();
        while (t != typeof(object))
        {
            l.AddRange(t.GetProperties());
            t = t.BaseType;
        }

или, может быть, вы хотите рекурсивную печать свойств, вплоть до уровня:

    public static void ReadALotOfValues(StringBuilder b, object o, int lvl, int maxLvl)
    {
        Type t = o.GetType();
        List<PropertyInfo> l = new List<PropertyInfo>();
        while (t != typeof(object))
        {
            l.AddRange(t.GetProperties());
            t = t.BaseType;
        }
        foreach (var item in l)
        {
            if (item.CanRead && item.GetIndexParameters().Length == 0)
            {
                object child = item.GetValue(o, null);
                b.AppendFormat("{0}{1} = {2}\n", new string(' ', 4 * lvl), item.Name, child);
                if (lvl < maxLvl)
                    ReadALotOfValues(b, child, lvl + 1, maxLvl);

            }
        }
    }

РЕДАКТИРОВАТЬ: Вызов вышеуказанного метода:

object o = ...some object here...;
var b = new StringBuilder();
ReadALotOfValues(b, o, 0, 5);
Console.WriteLine(b.ToString());

Выше будут считаны свойства до 5 уровней глубины в объекте.

Поиск должен быть каким-то образом ограничен, иначе он будет зацикливаться навсегда ... подумайте о объекте, ссылающемся на себя.

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