asp.net-mvc - 将 Expression<Func<T, bool?>> 转换为 Expression<Func<T, bool>>

标签 asp.net-mvc linq lambda expression

确实是一个简单的问题。

我有一个显示 Nullable Bool 的 MVC View ,例如,

Html.CheckBoxFor(model=>model.NullableBoolHere, Model.NullableBoolHere, 

我想创建一个新的 html 助手,它将接受这种类型,然后进行转换

Null || False => False
True => True

所以我有以下内容

public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes, bool disabled)
    {
        IDictionary<string, object> values = new RouteValueDictionary(htmlAttributes);

        if (disabled)
            values.Add("disabled", "true");

        Expression<Func<TModel, bool>> boolExpression = CONVERT_TO_BOOL_HERE(expression);


        return htmlHelper.CheckBoxFor(expression, values);
    }

感谢任何帮助,我知道我将不得不使用递归来复制表达式,但只是不确定如何导航表达式本身,找到 bool?,转换为 bool。

最佳答案

您可以使用此代码:

var body = Expression.Coalesce(expression.Body, Expression.Constant(false));
var boolExpression = (Expression<Func<TModel, bool>>)
    Expression.Lambda(body, expression.Parameters.First());

其他答案的优点是它不会编译第一个表达式,它只是包装它。生成的表达式与此代码创建的表达式类似:

m => m.NullableBoolHere ?? false

Check it live .

关于asp.net-mvc - 将 Expression<Func<T, bool?>> 转换为 Expression<Func<T, bool>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14356611/

相关文章:

asp.net-mvc - Web 应用程序中的 n 层架构范围是什么?

c# - 不包含带有2个参数的构造函数

javascript - 我的函数没有返回所有检查的值

c# - 为什么此 CollectionAssert.AreEquivalent() 测试失败?

python - 使用无服务器的 Numpy lambda 错误

jQuery UI 对话框打开部分 View (.ascx)

c# - 使用 linq 按具有空数据值的日期进行分组

c# - 从客户端向服务器发送 lambda 表达式

Ruby block 、procs 和 instance_eval

c# - 将 Lambda 表达式存储为变量