【问题标题】:C# - Recursive / Reflection Property ValuesC# - 递归/反射属性值
【发布时间】:2011-02-11 04:15:24
【问题描述】:

在 C# 中解决此问题的最佳方法是什么?

string propPath = "ShippingInfo.Address.Street";

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

this.ShippingInfo.Address.Street 

平衡性能与优雅。所有对象图关系应该是一对一的。 第 2 部分:如果它是 List 或类似的东西,添加它获取第一个的能力会有多难。

【问题讨论】:

    标签: c# .net reflection properties metaprogramming


    【解决方案1】:

    也许是这样的?

    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,你可以试试这个。 (虽然我个人更喜欢非 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);
    

    【讨论】:

    • +1 因为代码示例比其文本描述短 g
    • 我喜欢。我对表达这一点的困难表示纠正。很酷的 LINQ 实现。
    【解决方案2】:

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

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

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

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

    等等。你明白了。

    似乎有点冗长乏味,确实如此。但这就是您通过反射实现的方式。

    我想知道是否可以用 LINQ to Objects 做同样的事情?

    第 2 部分的答案涉及从列表中获取 X 的初始值。

    【讨论】:

    • 你能重写一下吗?不太容易理解 - 太多的单词:)
    • 没有。如果有的话,它太简短而且缺乏细节。这就是反射之类的问题,有很多步骤,每一步都需要特定的知识。对不起。
    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 2011-09-05
    • 1970-01-01
    • 2013-01-18
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多