我有一些
Expression<Func<T, bool>> exp
,我需要编写一种方法,该方法将返回新表达式,该新表达式表示包装在 try catch 中的原始表达式。例如,如果原始表达式看起来像 order => order.Product.Name == "Product 1"
但订单没有产品,我需要返回 false 而不是抛出异常;
这是我目前的方法,但它会抛出运行时异常,说 '
Expression of type 'System.Func
2[MyClass,System.Boolean]' 不能用于返回类型 'System.Boolean'`'
private static Expression<Func<T, bool>> FalseOnException<T>(this Expression<Func<T, bool>> exp)
{
Expression<Func<T, bool>> falseExp = parameter => false;
ParameterExpression parameter = exp.Parameters[0];
var tryExp = Expression.TryCatch(exp, Expression.Catch(typeof(NullReferenceException), falseExp));
return Expression.Lambda<Func<T, bool>>(tryExp.Body, parameter);
}
MyClass 是 T
我们可以稍微调整一下文档中的示例,我认为它有效:
Expression<Func<T, bool>> FalseOnNullReferenceException<T>(Expression<Func<T, bool>> exp) {
var parameterExpression = Expression.Parameter(typeof(T));
TryExpression tryCatchExpr =
Expression.TryCatch(
Expression.Invoke(exp, parameterExpression)
,
Expression.Catch(
typeof(NullReferenceException),
Expression.Constant(false, typeof(bool))
)
);
return Expression.Lambda<Func<T, bool>>(tryCatchExpr, parameterExpression);;
}