使用反射投射一个值并设置一个 属性

Cast a value and set a property using 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

Additional information: Object does not match target type.

不知道this指的是我要设置属性的值还是对象。两者都绝对是预期的类型。但是,值作为 object 传入,Element 作为 属性 信息的 DeclaringType 的基类型传入。

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

改变

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 的回答)。

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

_propertyInfo.SetValue(Element, value, null);