C# Reflexion => PropertyInfo индексированного элемента списка (например, obj1.List‹obj3›[0])

Я сделал метод для зацикливания объекта и возврата PropertyInfo каждого из его свойств.

Это нормально для всех, кроме типов объектов, которые находятся в списке.

Мне нужно вернуть PropertyInfo первого (или следующего) объекта в списке;

Например, если я помещаю параметр «obj1.MyList[0]» в свой метод, он возвращает PropertyInfo obj3, потому что MyList является свойством типа «Список».

        /// <summary>Récupère les meta-information de la propriétés "pPropertyName".</summary>
    /// <returns>Item1=PropertyInfo, Item2=ObjetParent, Item3=ValeurDeLaPropriété</returns>
    public static Tuple<PropertyInfo, object, object> GetPiByName(object pObj, string pPropertyName) {
        PropertyInfo pi = null;
        object val = pObj;
        object valParent = null;
        Type currentType = val.GetType();
        var idx = -1;
        foreach (string propertyName in pPropertyName.Split('.')) {
            var posi = propertyName.IndexOf('[');
            if ((posi>0) && int.TryParse(propertyName.Substring(posi + 1, propertyName.Length - propertyName.IndexOf(']')), out idx)) {
                pi = currentType.GetProperty(propertyName.Substring(0, posi));
                currentType = pi.PropertyType;
                valParent = val;
                val = pi.GetValue(val, null);
                if ((val is IEnumerable) && (idx >= 0)) { // Pour les listes
                    valParent = val;
                    val = ((IList)val)[idx];
                    currentType = val.GetType();
                    pi = ??? [WHAT DO I PUT FOR RETURN PropertyInfo OF VAL] ???
                    idx = -1;
                    continue;
                } // */
            } else
                pi = currentType.GetProperty(propertyName);
            currentType = pi.PropertyType;
            valParent = val;
            val = pi.GetValue(val, null);
        }
        return new Tuple<PropertyInfo, object, object>(pi, valParent, val);
    }

С Уважением


person david    schedule 16.01.2017    source источник
comment
Элементы внутри списка не являются свойствами и не могут иметь свойствоInfo.   -  person Ian    schedule 16.01.2017
comment
Если я правильно вас понял, если val равно IEnumerable, вам придется перебрать его и получить PropertyInfo каждого элемента в списке.   -  person Bradley Uffner    schedule 16.01.2017
comment
Синтаксис obj1.List<obj3>[0] не имеет смысла. Может быть несколько свойств типа List<obj3>. В любом случае вам нужно относиться к коллекциям по-разному. Если вы определяете [n] как синтаксис для возврата n-го элемента в коллекции, затем приведите объект к типу коллекции с индексатором и верните n-й элемент. В худшем случае вам нужно на самом деле перечислить, чтобы сделать это. Вам также, кажется, не хватает рекурсии (foo.Foo2.Foo3.ListProp[3]).   -  person CodeCaster    schedule 16.01.2017
comment
Привет Ян, да, я тоже так думал, но я могу получить PropertyInfo Obj1.Obj3 (не в массиве), я надеюсь, что можно получить тот же результат с элементом списка.   -  person david    schedule 18.01.2017
comment
Привет, Брэдли, Val - это значение, которое было установлено в свойстве, я могу получить все значения моего списка, но не PropertyInfo индексированного элемента.   -  person david    schedule 18.01.2017
comment
Привет CodeCaster, действительно, obj1.List‹obj3›[0] не имеет смысла, но я думаю, что это говорит и кратко, кто желателен для титула. Проблема в том, что я не могу получить PropertyInfo без родительского свойства. И в этом случае я не могу ее определить. Если у вас есть идея, не могли бы вы показать пример, пожалуйста?   -  person david    schedule 18.01.2017


Ответы (2)


obj1.MyList[0] не относится к свойству — он относится к результату оценки геттера свойства индексатора MyList с аргументом 0.

Синтаксис a.prop[0] — это просто сахар синтаксиса C# для a.prop.get_Item(0), где get_Item — это сгенерированный компилятором метод получения для свойства индексатора.

То, чего вы пытаетесь достичь, не более важно, чем просить MethodInfo из int.Parse("123") — вы можете взять MethodInfo из int.Parse, но не int.Parse("123").

person Stefan Dragnev    schedule 16.01.2017
comment
Хорошо, это невозможно, так что. я должен обработать этот случай по-другому. Я интерпретирую список и получу тип после. Спасибо всем за ваши фары - person david; 18.01.2017

Я почти уверен, что вы не можете определить 3-й элемент списка как свойство.

Откуда: https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx

Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного поля. Свойства можно использовать так, как если бы они были общедоступными элементами данных, но на самом деле они являются специальными методами, называемыми средствами доступа. Это позволяет легко получить доступ к данным и по-прежнему способствует повышению безопасности и гибкости методов.

Можете пояснить, для чего вам это нужно?

person Andrei Neagu    schedule 16.01.2017
comment
это для автоматизации динамического фильтра. по типу свойства я хочу отображать адаптированный элемент управления (текстовое поле для строки, поле со списком для перечисления, автозаполнение для объекта,...). и пользователь может создать коллекцию для объединения множества фильтров одного и того же объекта. Но мне нужно получить тип свойства типа коллекции для повторного использования моей автоматизации. - person david; 18.01.2017