using System;
using System.Linq;
using System.Linq.Expressions;
public class Test
{
public static void Main()
{
var boolExpression = ConvertToBool<Model>(m => m.NullableBoolHere);
// Test:
Console.WriteLine(boolExpression.Compile()(new Model(){NullableBoolHere = true } ));
Console.WriteLine(boolExpression.Compile()(new Model(){NullableBoolHere = false } ));
Console.WriteLine(boolExpression.Compile()(new Model(){NullableBoolHere = null } ));
}
public static Expression<Func<TModel, bool>> ConvertToBool<TModel>(Expression<Func<TModel, bool?>> expression)
{
var body = Expression.Coalesce(expression.Body, Expression.Constant(false));
var boolExpression = (Expression<Func<TModel, bool>>)
Expression.Lambda(body, expression.Parameters.First());
return boolExpression;
}
class Model
{
public bool? NullableBoolHere {get;set;}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkxpbnEuRXhwcmVzc2lvbnM7CnB1YmxpYyBjbGFzcyBUZXN0CnsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKICAgIHsKICAgICAgICB2YXIgYm9vbEV4cHJlc3Npb24gPSBDb252ZXJ0VG9Cb29sPE1vZGVsPihtID0+IG0uTnVsbGFibGVCb29sSGVyZSk7CiAgICAgICAgCiAgICAgICAgLy8gVGVzdDoKICAgICAgICBDb25zb2xlLldyaXRlTGluZShib29sRXhwcmVzc2lvbi5Db21waWxlKCkobmV3IE1vZGVsKCl7TnVsbGFibGVCb29sSGVyZSA9IHRydWUgfSApKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShib29sRXhwcmVzc2lvbi5Db21waWxlKCkobmV3IE1vZGVsKCl7TnVsbGFibGVCb29sSGVyZSA9IGZhbHNlIH0gKSk7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoYm9vbEV4cHJlc3Npb24uQ29tcGlsZSgpKG5ldyBNb2RlbCgpe051bGxhYmxlQm9vbEhlcmUgPSBudWxsIH0gKSk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbjxGdW5jPFRNb2RlbCwgYm9vbD4+IENvbnZlcnRUb0Jvb2w8VE1vZGVsPihFeHByZXNzaW9uPEZ1bmM8VE1vZGVsLCBib29sPz4+IGV4cHJlc3Npb24pCiAgICB7CiAgICAgICAgdmFyIGJvZHkgPSBFeHByZXNzaW9uLkNvYWxlc2NlKGV4cHJlc3Npb24uQm9keSwgRXhwcmVzc2lvbi5Db25zdGFudChmYWxzZSkpOwogICAgICAgIHZhciBib29sRXhwcmVzc2lvbiA9IChFeHByZXNzaW9uPEZ1bmM8VE1vZGVsLCBib29sPj4pCiAgICAgICAgICAgIEV4cHJlc3Npb24uTGFtYmRhKGJvZHksIGV4cHJlc3Npb24uUGFyYW1ldGVycy5GaXJzdCgpKTsKICAgICAgICByZXR1cm4gYm9vbEV4cHJlc3Npb247CiAgICB9CiAgICAKICAgIGNsYXNzIE1vZGVsCiAgICB7CiAgICAgICAgcHVibGljIGJvb2w/IE51bGxhYmxlQm9vbEhlcmUge2dldDtzZXQ7fQogICAgfQp9