C# - 递归/反射属性值

时间:2010-04-22 16:51:54

标签: c# .net reflection properties metaprogramming

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

string propPath = "ShippingInfo.Address.Street";

我将拥有一个属性路径,就像从映射文件中读取的那个。 我需要能够向Order对象询问下面代码的值是什么。

this.ShippingInfo.Address.Street 

平衡表现与优雅。所有对象图关系应该是一对一的。 第2部分:如果它的列表<>是多么难以添加其抓住第一个的能力。或类似的东西。

2 个答案:

答案 0 :(得分:25)

也许是这样的?

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 :(得分:1)

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

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

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

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

等等。你得到了照片。

似乎有点冗长乏味,而且确实如此。但这就是你如何通过反思来做到这一点。

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

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