C#中直接设置属性正常,反射设置为何抛出类型转换异常?
问题原因解析
直接赋值parentOfProperty.TargetProp = 5.0;能正常运行,核心原因是TargetPropType类型定义了从double到自身的隐式转换运算符。C#编译器在编译这段代码时,会自动识别这个隐式转换规则,自动生成把5.0转换成TargetPropType实例的代码,再完成赋值——这是编译器提供的语法糖,帮你省略了显式转换的步骤。
而反射调用PropertyInfo.SetValue或SetMethod.Invoke时,属于纯运行时操作,不会触发编译器的隐式转换逻辑。反射机制要求传入的参数类型必须与属性的实际类型(TargetPropType)严格匹配,你直接传入double类型的值,自然会抛出类型不匹配的ArgumentException。
解决方法
在反射赋值前,手动将double值转换为TargetPropType实例,再传入反射方法:
// 利用隐式转换手动转换 var targetValue = (TargetPropType)5.0; // 或者调用对应构造函数(如果TargetPropType支持) // var targetValue = new TargetPropType(5.0); propertyInfo.SetValue(parentOfProperty, targetValue);
内容的提问来源于stack exchange,提问作者user2653422
相关产品推荐
相关产品推荐

