转换表达式<func <tmodel,boolean?>&gt;表达式<func <tmodel,boolean>&gt; </func <tmodel,boolean> </func <tmodel,boolean?>

时间:2013-03-04 15:26:15

标签: c# generics lambda expression-trees expression

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

在我们的情况下,对于这种特定情况,nullfalse相同,必须显示未经检查的HTML复选框。

如何将Expression<Func<TModel,Boolean?>>转换为Expression<Func<TModel,Boolean>>,在路上添加value = nullableValue.HasValue && nullableValue.Value之类的内容?

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

干杯。

1 个答案:

答案 0 :(得分: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