Получение PropertyDescriptor вложенного объекта - PullRequest
1 голос
/ 02 февраля 2012

У меня есть следующий код:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        object o;
        Person p = new Person { FirstName = "John", Surname = "Henry" };
        Citizen c = new Citizen { Country = "Canada", ResidentName = p };
        SportsFan sf = new SportsFan { Sport = "Hockey", Fan = c };

        Discoverer<SportsFan>.SimpleExample("Sport", "Hockey",out o);
        Discoverer<SportsFan>.NestedProperyExample("Fan.Citizen.FirstName", "John",out o);
    }

    private class Person
    {
        public string FirstName
        {
            get; set;
        }

        public string Surname
        {
            get; set;
        }
    }

    private class Citizen
    {
        public Person ResidentName
        {
            get; set;
        }

        public string Country
        {
            get; set;
        }
    }

    private class SportsFan
    {
        public string Sport
        {
            get; set;
        }

        public Citizen Fan
        {
            get; set;
        }
    }

    private class Discoverer<T>
    {
        public static void SimpleExample(string propName, string objResultToString,out Object obj)
        {
            PropertyDescriptor propDesc;
            propDesc = TypeDescriptor.GetProperties(typeof(T))[propName];               

            TypeConverter converter = TypeDescriptor.GetConverter(propDesc.PropertyType);
            obj = converter.ConvertFromString(objResultToString);                   
        }

        public static void NestedProperyExample(string propName, string objResultToString, out Object obj)
        {
            PropertyDescriptor propDesc = null;
            obj = null;
            string[] nestedProperties = propName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);

            propDesc = TypeDescriptor.GetProperties("Form1." + nestedProperties[0])[nestedProperties[1]];
            for (int i = 1; i < nestedProperties.Length - 1; i++)
            {
                if (propDesc != null)
                    propDesc = TypeDescriptor.GetProperties(propDesc.GetType())[nestedProperties[i + 1]];
            }

            if (propDesc != null)
            {
                TypeConverter converter = TypeDescriptor.GetConverter(propDesc.PropertyType);
                obj = converter.ConvertFromString(objResultToString);
            }

        }
    }


}

Код работает для simpleExample.На NestedPropertyExample первое присваивание PropDesc возвращает null.Когда я проверяю TypeDescriptor.GetProperties("Form1." + nestedProperties[0]), он возвращает PropertyDescriptorCollection одного элемента, и это длина.

Почему я не возвращаю больше PropertyDesriptor элементов?Правильно ли я поступаю так?

Спасибо, Билл N

1 Ответ

2 голосов
/ 26 апреля 2012

Метод NestedProperyExample написан с ошибкой, но не возражайте - это не проблема (: На самом деле проблема может быть в том, что метод NestedProperyExample вызывает перегрузку TypeDescriptor.GetProperties(Object), передавая ей некоторую строку ("Form1." + nestedProperties[0]). Согласно документам ( MSDN ), он действует очень похоже на то, что просто у TypeDescriptor.GetProperties(typeof(string)). string есть только одно простое свойство - Length - и поэтому TypeDescriptor.GetPropertiesбольше не возвращает PropertyDescriptor предметов.

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

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