代码之家  ›  专栏  ›  技术社区  ›  BuddyJoe

C-递归/反射属性值

  •  12
  • BuddyJoe  · 技术社区  · 14 年前

    在C中,最好的方法是什么?

    string propPath = "ShippingInfo.Address.Street";
    

    我将从映射文件中读取一个与上面类似的属性路径。 我需要能够询问order对象下面代码的值是什么。

    this.ShippingInfo.Address.Street 
    

    兼顾性能与优雅。所有对象图关系都应该是一对一的。 第2部分:如果它是一个列表或类似的列表,那么为它添加获取第一个列表的能力有多困难?

    2 回复  |  直到 14 年前
        1
  •  25
  •   LukeH    14 年前

    也许是这样?

    string propPath = "ShippingInfo.Address.Street";
    
    object propValue = this;
    foreach (string propName in propPath.Split('.'))
    {
        PropertyInfo propInfo = propValue.GetType().GetProperty(propName);
        propValue = propInfo.GetValue(propValue, null);
    }
    
    Console.WriteLine("The value of " + propPath + " is: " + propValue);
    

    或者,如果你喜欢林肯,你可以试试这个。(尽管我个人更喜欢非LINQ版本。)

    string propPath = "ShippingInfo.Address.Street";
    
    object propValue = propPath.Split('.').Aggregate(
        (object)this,
        (value, name) => value.GetType().GetProperty(name).GetValue(value, null));
    
    Console.WriteLine("The value of " + propPath + " is: " + propValue);
    
        2
  •  1
  •   kmontgom    14 年前

    听起来像一组嵌套的属性调用:

    类X具有名为ShippingInfo的属性;由ShippingInfo表示的类型具有属性地址;由Address表示的类型具有名为Street的属性。

    因此,假设您知道要操作的类X的适当实例:

    • 通过string.split(“...ToCharArray())将字符串标记为string[],或类似的操作。
    • 从已知的X实例开始
    • 使用反射获取ShippingInfo getter的MethodInfo
    • 使用反射获取ShippingInfo get()返回的类型
    • 使用反射调用getter
    • 使用ShippingInfo get()的返回值和返回类型:
      • 获取返回类型中地址getter的MethodInfo…..

    等等。你拿到照片了。

    看起来有点长,有点乏味,确实如此。但这就是通过反思来实现的。

    我想知道是否可以用linq-to对象做同样的事情?

    第2部分的答案包括从列表中获取x的初始值<>。