请考虑此准则:
string propertyValue = "1";
PropertyInfo info = obj.GetType().GetProperty("MyProperty");
info.SetValue(detail, Convert.ChangeType(propertyValue, info.PropertyType), null);
问题是info.PropertyType
的类型是System.Byte?
,当第3行想要执行时我得到了这个错误:
“从'System.String'到'System.Nullable`1 [[System.Byte,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'的无效演员表。”}
我如何解决这个问题?
由于
答案 0 :(得分:4)
Convert.ChangeType()
存在可空类型的问题。
尝试先检查类型是否可以为空。如果是这样,请采用基础类型:
var targetType = Nullable.GetUnderlyingType(info.PropertyType);
if (targetType == null)
targetType = info.PropertyType;
然后,您可以致电Convert.ChangeType(propertyValue, targetType)
。
不幸的是,这会带来另一个问题:ChangeType()
无法将"1"
或"0"
转换为布尔值。但是,它适用于"true"
和"false"
。它也适用于0
和1
作为整数。
Check the fiddle I prepared for you
这个问题对您而言可能是个问题 - 我不知道这些值来自哪些规格。
答案 1 :(得分:0)
这个解决方案更好:
PropertyInfo info = detail.GetType().GetProperty(propertyName);
var targetType = Nullable.GetUnderlyingType(info.PropertyType);
if (targetType == null)
targetType = info.PropertyType;
object safeValue = (propertyValue == null) ? null : Convert.ChangeType(propertyValue, targetType);
info.SetValue(detail, safeValue, null);