Expression ChangeNullableType(Expression value)
{
MethodInfo getType = typeof(object).GetMethod("GetType");
FieldInfo IsGenericType = typeof(Type).GetField("IsGenericType");
MethodInfo CreateInstance = typeof(Activator).GetMethod("CreateInstance");
MethodInfo ChangeType = typeof(Convert).GetMethod("ChangeType");
MethodInfo GetGenericTypeDefinition = typeof(Type).GetMethod("GetGenericTypeDefinition");
Expression conversionType = Expression.Call(value, getType);
/*if (conversionType.IsGenericType &&
conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
System.ComponentModel.NullableConverter nullableConverter =
new System.ComponentModel.NullableConverter(conversionType);
conversionType = nullableConverter.UnderlyingType;
}*/
Expression condition = Expression.And(
Expression.Equal(Expression.Field(conversionType, IsGenericType), Expression.Constant(true)),
Expression.Equal(Expression.Call(conversionType, GetGenericTypeDefinition),
Expression.Constant(typeof(Nullable<>))));
Expression nullableConverter = Expression.Call(CreateInstance,
Expression.Constant(typeof(System.ComponentModel.NullableConverter)), conversionType);
Expression conversionTypeRet = Expression.Field(nullableConverter, "UnderlyingType");
return Expression.IfThenElse(condition,
Expression.Call(ChangeType, value, conversionTypeRet)
, value);
}
Expression转换可空字段
最新推荐文章于 2021-04-28 15:31:25 发布