C# - 递归/反射属性值

Posted

技术标签:

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

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

string propPath = "ShippingInfo.Address.Street";

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

this.ShippingInfo.Address.Street 

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

【问题讨论】:

【参考方案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 的初始值。

【讨论】:

你能重写一下吗?不太容易理解 - 太多的单词:) 没有。如果有的话,它太简短而且缺乏细节。这就是反射之类的问题,有很多步骤,每一步都需要特定的知识。对不起。

以上是关于C# - 递归/反射属性值的主要内容,如果未能解决你的问题,请参考以下文章

c#如何让递归函数输出多个结果

java反射获取属性值

如何使用反射递归序列化对象?

如何用java递归生成带children的json串

注解+反射+递归动态生成多层XML

在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?