将表达式包裹在Expression.TryCatch中

问题描述 投票:0回答:1

我有一些

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

c# lambda expression
1个回答
0
投票

我们可以稍微调整一下文档中的示例,我认为它有效:

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);;

}
© www.soinside.com 2019 - 2024. All rights reserved.