【问题标题】:C# Reflexion => PropertyInfo of indexed item of list (like obj1.List<obj3>[0])C# Reflexion => 列表索引项的 PropertyInfo(如 obj1.List<obj3>[0])
【发布时间】: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。
  • 如果我理解正确,如果valIEnumerable,您将不得不遍历它并获取列表中每个项目的PropertyInfo
  • 语法obj1.List&lt;obj3&gt;[0] 没有意义。可以有多个List&lt;obj3&gt; 类型的属性。无论如何,您需要以不同的方式对待集合。如果您确定[n] 是返回集合中第n 个项目的语法,则将对象转换为具有索引器的集合类型并返回第n 个项目。最坏的情况是,您需要实际枚举才能做到这一点。您似乎也缺少递归 (foo.Foo2.Foo3.ListProp[3])。
  • 你好伊恩,是的,我也是这么想的,但是我可以得到 Obj1.Obj3 的 PropertyInfo(不在数组中),我希望可以得到与 List 项相同的结果。跨度>
  • 你好 Bradley,Val 是属性中设置的值,我可以获取我的 List 的所有值,但没有索引项的 PropertyInfo。

标签: c# propertyinfo


【解决方案1】:

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

语法a.prop[0] 只是a.prop.get_Item(0) 的C# 语法糖,其中get_Item 是编译器生成的索引器属性的getter 方法。

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

【讨论】:

  • 好吧,这是不可能的,所以。我必须以不同的方式处理这个案子。我将解释列表并获取之后的类型。谢谢大家的灯
【解决方案2】:

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

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

属性是提供灵活读取机制的成员, 写入或计算私有字段的值。可以使用属性 好像它们是公共数据成员,但它们实际上是特殊的 称为访问器的方法。这样可以轻松访问数据,并且 仍然有助于提高方法的安全性和灵活性。

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

【讨论】:

  • 它用于动态过滤器的自动化。按属性的类型,我想显示调整后的控件(字符串的文本框,枚举的组合框,对象的自动完成,...)。并且用户可以创建一个集合来累积相同对象的多个过滤器。但我需要获取集合的类型属性类型以重用我的自动化。
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多