考虑以下代码:的SetValue反射在C#
var future = new Future();
future.GetType().GetProperty(info.Name).SetValue(future, converted);
在上面的代码,我们应该传递两个参数为SetValue
。首先,我们要设置其属性的对象。其次,新的价值。但是我们选择特定的属性。
为什么我们应该通过第一个参数来设置值,因为我们已经设置了未来的对象!?
考虑以下代码:的SetValue反射在C#
var future = new Future();
future.GetType().GetProperty(info.Name).SetValue(future, converted);
在上面的代码,我们应该传递两个参数为SetValue
。首先,我们要设置其属性的对象。其次,新的价值。但是我们选择特定的属性。
为什么我们应该通过第一个参数来设置值,因为我们已经设置了未来的对象!?
因为未来对象是一个实例。 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设置其他实例的属性。
您尚未设置未来对象 - 您只需提取其类型,然后对其进行操作。你最终得到的是一个PropertyInfo
对象,它指向Future
类型的任何实例上的该属性。
这里
future.GetType()
future
仅用于获得它的类型。有效是一样
Type t = future.GetType();
t.GetProperty(info.Name).SetValue(future, converted);
在上述所有关于使用什么对象来获取类型丢失知识代码的第二行,我们正在处理的类型本身。后来,当我们获得有关该类型属性的信息时,我们需要知道它应与哪个对象配合使用,因此我们再次提供future
。
你可以很容易地做到以下几点:
typeof(Future).GetProperty(info.Name).SetValue(future, converted);
怎能实例没有future
参数一起服用?
考虑以下2类:
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
未绑定到一个实例,而是一个类型。
如果每个对象都必须记住它的获取方式,那么反射会(更)变得非常复杂,以至于它可以在以后使用保留的信息,而不是通过参数再次请求它。即有很多方法可以获得'Type',但不是所有的方法都需要首先使用该类型的实例。 –