Я сделал метод для зацикливания объекта и возврата 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);
}
С Уважением
val
равноIEnumerable
, вам придется перебрать его и получитьPropertyInfo
каждого элемента в списке. - person Bradley Uffner   schedule 16.01.2017obj1.List<obj3>[0]
не имеет смысла. Может быть несколько свойств типаList<obj3>
. В любом случае вам нужно относиться к коллекциям по-разному. Если вы определяете[n]
как синтаксис для возврата n-го элемента в коллекции, затем приведите объект к типу коллекции с индексатором и верните n-й элемент. В худшем случае вам нужно на самом деле перечислить, чтобы сделать это. Вам также, кажется, не хватает рекурсии (foo.Foo2.Foo3.ListProp[3]
). - person CodeCaster   schedule 16.01.2017