【发布时间】:2017-01-17 00:52:30
【问题描述】:
我创建了一个循环对象的方法并返回每个属性的 PropertyInfo。
对所有人都可以,除了列表中的对象类型。
我需要返回列表中第一个(或下一个)对象的 PropertyInfo;
例如,如果我将参数“obj1.MyList[0]”放到我的方法中,它会返回 obj3 的 PropertyInfo,因为 MyList 是“List”类型的属性。
/// <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);
}
问候
【问题讨论】:
-
List 中的项目不是属性,不能有 PropertyInfo。
-
如果我理解正确,如果
val是IEnumerable,您将不得不遍历它并获取列表中每个项目的PropertyInfo。 -
语法
obj1.List<obj3>[0]没有意义。可以有多个List<obj3>类型的属性。无论如何,您需要以不同的方式对待集合。如果您确定[n]是返回集合中第n 个项目的语法,则将对象转换为具有索引器的集合类型并返回第n 个项目。最坏的情况是,您需要实际枚举才能做到这一点。您似乎也缺少递归 (foo.Foo2.Foo3.ListProp[3])。 -
你好伊恩,是的,我也是这么想的,但是我可以得到 Obj1.Obj3 的 PropertyInfo(不在数组中),我希望可以得到与 List 项相同的结果。跨度>
-
你好 Bradley,Val 是属性中设置的值,我可以获取我的 List 的所有值,但没有索引项的 PropertyInfo。
标签: c# propertyinfo