动态获取属性值

Posted

技术标签:

【中文标题】动态获取属性值【英文标题】:Get property value dynamically 【发布时间】:2010-12-13 02:17:18 【问题描述】:

我有一个具有大量属性的对象。我想通过简单地遍历对象的属性集合来获取每个属性的值。

我已经研究了 PropertyInfo.GetValue() 方法,但是在我所拥有的上下文中它没有多大意义。

这是我正在尝试做的一个示例(顺便说一句,此代码不起作用):

foreach(var item in dataObjects)
  
    foreach(PropertyInfo prop in item.GetType().GetProperties())
    
      String value = prop.GetValue().ToString()
    
  

我现在意识到获取房产的价值并不是那么容易。我错过了什么?我真的不明白我需要传递给 GetValue() 方法的内容,因为我只是想要调用该方法的属性的值。

感谢您为我澄清这一点的任何帮助。我已经在这里呆了几个小时,只是把头撞在桌子上。

【问题讨论】:

它没有。这是我“想要”做的一个例子,而不是代码实际做的事情。 :) 【参考方案1】:

您需要提供要调用相关属性的特定对象:

prop.GetValue(item, null);

PropertyInfo 只是关于类型的属性 的元数据,而不是特定对象实例的元数据。 PropertyInfo 不知道它来自哪个实例(如果有的话)——只知道它来自哪个类型/类。

您几乎可以将 PropertyInfo 视为属性的名称。这些信息不足以单独使用它 - 然后我们必须在我们提供的对象上说“获取具有此名称的属性的值...什么?”。

【讨论】:

【参考方案2】:

PropertyInfo 表示属性机制本身(类型、get 方法、set 方法等),而不是绑定到特定实例的属性。如果属性是非静态的,您必须提供一个实例来读取该属性——这是 GetValue 的第一个参数。换句话说,如果pi 是一个PropertyInfo 代表某个类的Test 属性,而someObject 是该类的一个实例:

object a = someObject.Test;
object b = pi.GetValue(someObject, null);

那里的两行都获取同一对象上同一属性的值。如果属性是静态的,则显然不需要传递实例(改为传递 null )。第二个参数是索引属性的索引——C# 不支持索引属性(它支持不完全相同的索引器),因此您可能永远不需要为第二个参数传递任何内容,除非您正在工作来自用支持索引属性的语言编写的程序集的某种类型(我相信像 VB)。

【讨论】:

以上是关于动态获取属性值的主要内容,如果未能解决你的问题,请参考以下文章

csharp 动态从C#对象获取属性值

用Struts的动态form添加时为啥有的属性获取不到值?

为指令属性传递动态值获取未定义的Angular5

Django 动态名称属性并在views.py 中获取值

反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值

从字符串中获取C#动态对象的属性值(反射?)