考虑以下示例代码:
class SampleClass
{
public long SomeProperty { get; set; }
}
public void SetValue(SampleClass instance, decimal value)
{
// value is of type decimal, but is in reality a natural number => cast
instance.SomeProperty = (long)value;
}
现在,我需要通过反射来做类似的事情:
void SetValue(PropertyInfo info, object instance, object value)
{
// throws System.ArgumentException: Decimal can not be converted to Int64
info.SetValue(instance, value)
}
请注意,我不能假设PropertyInfo始终表示一个long,该值也不总是十进制。但是,我知道可以将值强制转换为该属性的正确类型。
如何通过反射将'value'参数转换为PropertyInfo实例表示的类型?
Convert.ChangeType(value, property.PropertyType);
如果value
不实现该IConvertible
接口,仍然会失败。例如,如果info.PropertyType
有的话IEnumerable