2009-11-04 643 views
7

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

我查看了PropertyInfo.GetValue()方法,但它在我的上下文中没有多大意义。

这里是我想要做的(这个代码不BTW工作)为例:

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

我现在认识到获得一个属性的值是不是很容易。我错过了什么?我不明白我需要传递给GetValue()方法,因为我只是想要调用该方法的属性的值。

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

+2

这是如何编译? – Tinister 2009-11-04 16:27:11

+2

它没有。这是我“想要”做的一个例子,而不是代码的实际功能。 :) – 2009-11-04 16:38:36

回答

10

您需要提供您要拨打的财产有问题的特定对象:

prop.GetValue(item, null); 

的的PropertyInfo只是metatdata关于类型财产,而不是基于特定对象实例。 PropertyInfo不知道它来自哪个实例(如果有) - 只是它来自的类型/类。

您几乎可以将PropertyInfo视为属性的名称。这是没有足够的信息单独做任何事情 - 我们然后不得不说“让这个名字的财产的价值... 什么?”关于我们提供的对象。

3

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

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

都没有得到行对同一对象的相同属性的值。如果该属性是静态的,那么显然不需要传递该实例(而是传递null)。第二个参数是索引属性的索引--C#不支持索引属性(它支持索引器,它们不完全相同),所以除非你工作,否则你可能永远不需要传递任何东西,除了第二个参数为null用一种支持索引属性(如VB)的语言编写的程序集中的某些类型,我相信。