C# 反射 => 列表索引项的 PropertyInfo(如 obj1.List<obj3>[0])

C# Reflexion => PropertyInfo of indexed item of list (like obj1.List<obj3>[0])

我创建了一个循环对象的方法,return 他的每个属性的 PropertyInfo。

除了列表中的对象类型之外,所有人都可以。

我需要 return 列表中第一个(或下一个)对象的 PropertyInfo;

例如,如果我将参数 "obj1.MyList[0]" 放入我的方法,它 return 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);
    }

此致

我很确定您不能将列表的第三个元素定义为 属性。

发件人:https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx

A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field. Properties can be used as if they are public data members, but they are actually special methods called accessors. This enables data to be accessed easily and still helps promote the safety and flexibility of methods.

你能解释一下你需要这个吗?

obj1.MyList[0] 不是指 属性 - 它指的是使用参数 属性 MyList 评估索引器 getter 的结果 0.

语法 a.prop[0] 只是 a.prop.get_Item(0) 的 C# 语法糖,其中 get_Item 是索引器 属性 的 compiler-generated getter 方法.

你想要达到的效果并不比要求 int.Parse("123")MethodInfo 更有效 - 你可以接受 int.ParseMethodInfo,但不能int.Parse("123").