我正在尝试动态设置对象的属性。该方法采用object
类型的参数,并使用PropertyInfo.SetValue()
设置对象的属性。
public void SetValue(object value)
{
var valueType = value.GetType();
// Passes
if (!_propertyInfo.PropertyType.IsAssignableFrom(valueType)) return;
var valueType = value.GetType();
// Tried but this doesn't help
// var value = (dynamic) value;
// Fails
_propertyInfo.SetValue(value, Element, null);
}
非常基本,正如你所看到的。但是,由于TargetException
,我不断获得object has the wrong type
。
其他信息:对象与目标类型不匹配。
我不知道这是否是指我想设置其属性的值或对象。两者都是预期的类型。但是,值将作为object
传递,Element
作为属性信息的DeclaringType
的基本类型传入。
这是问题的原因吗?如果Element
的具体类型未知,我该如何解决此限制?
答案 0 :(得分:3)
请参阅SetValue方法。您应该交换value
和object
参数:
_propertyInfo.SetValue(Element, value, null);
答案 1 :(得分:1)
更改
if (!_propertyInfo.PropertyType.IsAssignableFrom(valueType)) return;
到
if (!_propertyInfo.DeclaringType.IsAssignableFrom(valueType)) return;
在示例中
abstract class Vehicle
{
public int NumberOfWheels { get; set; }
}
PropertyType
为int
而DeclaringType
为Vehicle
。
这个答案假设你真的希望value
成为目标对象。正如其他人已经意识到的那样,你可能意味着Element
成为目标。在这种情况下,您的IsAssignableFrom
是正确的,您只需要将参数交换为SetValue
(参见Vlad的回答)。