C#Reflexion =&gt;列表的索引项的PropertyInfo(如obj1.List <obj3> [0])

时间:2017-01-16 16:32:54

标签: c# propertyinfo

我创建了一个循环对象的方法,并返回每个属性的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);
    }

此致

2 个答案:

答案 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}}。