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# - 递归/反射属性值的主要内容,如果未能解决你的问题,请参考以下文章