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