如何使用反射转换类型

时间:2017-08-22 11:19:11

标签: c# c#-4.0 reflection casting gettype

请考虑此准则:

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]]'的无效演员表。”}

我如何解决这个问题?

由于

2 个答案:

答案 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"。它也适用于01作为整数。

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);