使用反射投射一个值并设置一个 属性
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; }
}
PropertyType
是 int
而 DeclaringType
是 Vehicle
。
这个答案假定您确实希望 value
成为目标对象。正如其他人所意识到的,您可能意味着 Element
成为目标。在那种情况下,您的 IsAssignableFrom
是正确的,您只需要将参数交换为 SetValue
(请参阅 Vlad 的回答)。
参见SetValue方法。您应该交换 value
和 object
参数:
_propertyInfo.SetValue(Element, value, null);
我正在尝试动态设置对象的 属性。该方法采用 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; }
}
PropertyType
是 int
而 DeclaringType
是 Vehicle
。
这个答案假定您确实希望 value
成为目标对象。正如其他人所意识到的,您可能意味着 Element
成为目标。在那种情况下,您的 IsAssignableFrom
是正确的,您只需要将参数交换为 SetValue
(请参阅 Vlad 的回答)。
参见SetValue方法。您应该交换 value
和 object
参数:
_propertyInfo.SetValue(Element, value, null);