Expression转换可空字段

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


        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值