【问题标题】:Convert Expression<Func<TModel,Boolean?>> to Expression<Func<TModel,Boolean>>将 Expression<Func<TModel,Boolean?>> 转换为 Expression<Func<TModel,Boolean>>
【发布时间】:2013-03-04 15:26:14
【问题描述】:

ASP.NET MVC 中的一个方法需要一个表达式 Expression&lt;Func&lt;TModel,Boolean&gt;&gt;(在屏幕上显示一个复选框 HTML 控件),但我的成员是 Boolean?

在我们的例子中,对于这种特定情况,nullfalse 相同,必须显示一个未选中的 HTML 复选框。

我如何将Expression&lt;Func&lt;TModel,Boolean?&gt;&gt; 转换为Expression&lt;Func&lt;TModel,Boolean&gt;&gt;,顺便添加value = nullableValue.HasValue &amp;&amp; nullableValue.Value 之类的内容?

请记住,结果 Expression 必须仍然是 MemberExpression,是什么让我想知道这是否可能。

干杯。

【问题讨论】:

  • 如果你只想给你的可空布尔值一个默认值,使用短语nullableValue ?? false?? 将使用它的值,如果它有一个,如果没有,使用你指定的值。
  • 嗯,应用程序实际上并没有分配值。它只使用类来生成 HTML 模板,但不使用这些类的任何实例。

标签: c# generics lambda expression-trees expression


【解决方案1】:

如果您访问值属性(如intbool 等),您将不会获得MemberExpression,而是UnaryExpression,因为底层MemberExpression 包装在UnaryExpression 中负责做Convert 操作。

这似乎是因为值类型不是引用类型并且不接受null 值。

如果您愿意接受UnaryExpression,您可以通过以下方式进行:

Expression<Func<TModel, Boolean?>> source = ...

var resultBody = Expression.Convert(source.Body, typeof(Boolean));    
var result = Expression.Lambda<Func<TModel, Boolean>>(resultBody, source.Parameters);

您可能会发现有用的 stackoverflow question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多