繁体   English   中英

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

[英]Cast a value and set a property using reflection

我正在尝试动态设置对象的属性。 该方法采用类型为object的参数,并使用PropertyInfo.SetValue()设置对象的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);        
}

如您所见,这很简单。 但是,由于object has the wrong type ,因此我不断收到TargetException

附加信息:对象与目标类型不匹配。

例外

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

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

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

_propertyInfo.SetValue(Element, value, null);  

更改

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM