C# - 递归 / 反射属性值

12

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

string propPath = "ShippingInfo.Address.Street";
我将从映射文件中读取像上面那样的属性路径。我需要能够询问Order对象下面的代码的值将是什么。
this.ShippingInfo.Address.Street 

在性能和优雅之间取得平衡。所有对象关系图应该是一对一的。 第二部分:如果它是一个List<>或类似的东西,那么添加获取第一个的功能会有多难。

2个回答

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 因为代码示例比文本描述要短 g - Foxfire
我喜欢它。我对表达这个问题的困难有所改正。LINQ实现也很酷。 - kmontgom

1

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

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

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

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

等等。你明白了。

看起来有点冗长而乏味,确实如此。但这就是您通过反射执行它的方式。

我想知道是否可以使用LINQ to Objects完成相同的事情?

第二部分的答案涉及从List<>中获取X的初始值。


你能否重新写一下这个吗?不太容易理解——有太多的词语了 :) - Nayan
不好意思,这个回答太简略了,缺乏细节。反射编程就是这样的问题,其中有许多步骤,每一步都需要特定的知识。抱歉。 - kmontgom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接