我创建了一个循环对象的方法,并返回每个属性的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);
}
此致
答案 0 :(得分:0)
我很确定你不能将列表的第3个元素定义为属性。
来自:https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx
属性是一个提供灵活读取机制的成员, 写或计算私有字段的值。可以使用属性 好像他们是公共数据成员,但他们实际上是特殊的 称为访问器的方法。这样可以轻松访问数据 仍然有助于提高方法的安全性和灵活性。
你能解释一下你需要什么吗?
答案 1 :(得分:0)
obj1.MyList[0]
不引用属性 - 它指的是使用参数MyList
评估索引器属性0
的getter的结果。
语法a.prop[0]
只是a.prop.get_Item(0)
的C#语法糖,其中get_Item
是编译器生成的索引器属性的getter方法。
您要实现的目标不仅仅是要求MethodInfo
的{{1}} - 您可以int.Parse("123")
MethodInfo
,而不是int.Parse
int.Parse("123")
{1}}。