12

考虑这段代码:

var future = new Future();
future.GetType().GetProperty(info.Name).SetValue(future, converted);

在上面的代码中,我们应该为SetValue. 首先,我们要设置其属性的对象。二是新价值。但是我们选择特定的属性。

为什么我们应该传递第一个参数来设置值,就像我们之前设置的未来对象一样!?

4

5 回答 5

18

因为未来对象是一个实例。PropertyInfo是从类型 ( ) 中检索的,并且Type type = future.GetType();未绑定到任何实例。这就是为什么您必须在SetValue()中传递实例的原因。

所以:

var future = new Future();

var propertyName = "...";
Type type = future.GetType();
PropertyInfo propertyInfo = type.GetProperty(propertyName);

propertyInfo.SetValue(future, value);

您可以重用propertyInfo来设置其他实例的属性。

于 2013-08-12T07:59:18.277 回答
4

这里

future.GetType()

future仅用于获取其类型。实际上它是一样的

Type t = future.GetType();
t.GetProperty(info.Name).SetValue(future, converted);

在上面的代码的第二行,关于使用什么对象来获取类型的所有知识都丢失了,我们正在处理类型本身。稍后,当我们获得有关类型属性的信息时,我们需要知道它应该与什么对象一起使用,因此我们future再次提供。

于 2013-08-12T08:00:29.503 回答
3

您之前没有设置未来对象 - 您只是提取了它的类型,然后对其进行操作。你最终得到的是一个PropertyInfo在任何 type 实例上引用该属性的对象Future

于 2013-08-12T07:59:28.210 回答
0

您可以轻松地执行以下操作:

typeof(Future).GetProperty(info.Name).SetValue(future, converted);

future没有参数怎么能取到实例?

于 2013-08-12T08:00:49.520 回答
0

考虑这两个类:

class Future
{
    public int MyProperty { get; set; }
}
class FarFuture : Future { }

看看这段代码:

var future = new Future();
var farFuture = new FarFuture();
future.GetType().GetProperty(info.Name).SetValue(farFuture, converted);

PropertyInfo不是绑定到实例,而是绑定到类型。

于 2013-08-12T08:01:00.430 回答