动态获取属性值

时间:2009-11-04 16:23:34

标签: c# reflection properties

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

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

以下是我正在尝试做的一个示例(此代码无法正常工作):

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

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

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

2 个答案:

答案 0 :(得分:10)

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

prop.GetValue(item, null);

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

您几乎可以将PropertyInfo视为属性的名称。这不足以让它单独做任何事情 - 我们不得不说“用这个名字获取属性的价值...... 什么?”在我们提供的对象上。

答案 1 :(得分:3)

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

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

这两行都获得同一对象上相同属性的值。如果属性是静态的,则显然不需要传递实例(而是传递null)。第二个参数是索引属性的索引 - C#不支持索引属性(它支持索引器,它们不完全相同),因此除非你正在工作,否则你可能永远不需要为第二个参数传递除null之外的任何东西使用一种用支持索引属性的语言编写的程序集中的某些类型(比如VB,我相信)。