在我使用反射设置可空类型(例如:类型?)的时候发现一个坑,这把我坑了一上午,平时用非可空类型倒是没发现这问题。
//尝试转换类型
//第一个参数值,第二个参数为类型(type的类型)
var changeValue = Convert.ChangeType(propertiesDic[j.Name].GetValue(obj), j.PropertyType);
以上转换后就可以丢入PropertyInfo对应的类型
但是在PropertyInfo是可空类型时就需要:1、先判断是否为可空泛型
2、安全起见类型字符串在等于Nullable
3、然后在通过Nullable.GetUnderlyingType(可空的type类型)获得可空的类型
4、在用Convert.ChangeType(0, propType);进行转换得到对应类型的值
//判断是否为可空泛型
if (types.GetProperty(name).PropertyType.IsGenericType && types.GetProperty(name)
.PropertyType.GetGenericTypeDefinition().FullName.Contains(typeof(Nullable).ToString()))
{
var propType = Nullable.GetUnderlyingType(types.GetProperty(name).PropertyType);
var changeType = Convert.ChangeType(0, propType);
types.GetProperty(name).SetValue(source, changeType);
}