动态获取属性值

7
我有一个对象,它有大量的属性。 我想通过简单地循环遍历对象的属性集合来获取每个属性的值。
我已经研究了PropertyInfo.GetValue()方法,但在我的情况下它没有太多意义。
这是我尝试做的示例(此代码不起作用):
foreach(var item in dataObjects)
  {
    foreach(PropertyInfo prop in item.GetType().GetProperties())
    {
      String value = prop.GetValue().ToString()
    }
  }

我现在意识到获取属性值并不容易。我错过了什么?我不太理解需要传递给GetValue()方法的参数,因为我只想要调用该方法的属性的值。

感谢您帮助我澄清这个问题。我已经花了几个小时在这里一直敲打桌子。


2
这并不是实际代码的运行结果,而是我“想要”实现的一个例子。 :) - Jamie Dixon
2个回答

10

你需要提供要调用所需属性的具体对象:

prop.GetValue(item, null);

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

你可以把PropertyInfo几乎看作是属性的名称。仅凭此信息无法做任何事情 - 然后我们必须说“获取具有此名称的属性的值在... 哪里?” 在我们提供的对象上。


3

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

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

这两行代码获取的是同一个对象上的相同属性值。如果该属性是静态的,你显然不需要传递实例(请传递null)。第二个参数是用于索引属性的索引 - C# 不支持索引属性(它支持索引器,但并不完全相同),因此除非你使用的某个程序集中的类型支持索引属性(例如VB),否则你很可能永远不需要传递任何东西作为第二个参数而只需传递 null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接