转换值并使用反射设置属性

时间:2015-01-30 11:57:26

标签: c# reflection

我正在尝试动态设置对象的属性。该方法采用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

  

其他信息:对象与目标类型不匹配。

Exception

我不知道这是否是指我想设置其属性的值或对象。两者都是预期的类型。但是,值将作为object传递,Element作为属性信息的DeclaringType的基本类型传入。

这是问题的原因吗?如果Element的具体类型未知,我该如何解决此限制?

2 个答案:

答案 0 :(得分:3)

请参阅SetValue方法。您应该交换valueobject参数:

_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; }
}

PropertyTypeintDeclaringTypeVehicle


这个答案假设你真的希望value成为目标对象。正如其他人已经意识到的那样,你可能意味着Element成为目标。在这种情况下,您的IsAssignableFrom是正确的,您只需要将参数交换为SetValue(参见Vlad的回答)。