c#中反射中的SetValue

本文关键字:SetValue 反射 | 更新日期: 2023-09-27 18:27:13

考虑以下代码:

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

在上面的代码中,我们应该为SetValue传递两个参数。首先,我们要设置其属性的对象。第二,新的价值观。但我们选择具体的属性。

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

c#中反射中的SetValue

因为future对象是一个实例。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);

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

此处为

future.GetType()

CCD_ 3仅用于获得其类型。实际上,它与相同

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

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

您以前没有设置过future对象——您只是提取了它的类型,然后对其进行了操作。最终得到的是一个PropertyInfo对象,该对象引用任何类型为Future的实例上的该属性。

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

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

如果没有future参数,该实例如何获取?

考虑这两个类:

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没有绑定到实例,而是绑定到类型。