C# Expression class 方法扩展,使字符串比较不区分大小写

C# Expression class method extension, making string comparison case insensitive

这是我的表达式扩展方法,它向 Expression (System.Linq.Expressions.Expression) class 添加了 InBetweenStr 功能。但是,我想暗示字符串比较忽略大小写,所以我修改了 StringComparisonExpression 并添加了第三个参数:StringComparison.CurrentCultureIgnoreCase。但是当然代码不起作用并抛出一个异常说:"Incorrect number of arguments supplied for call to method Int32 Compare(System.String, System.String, System.StringComparison)".

所以我想知道是否有一种优雅的方法可以使字符串比较不区分大小写,而不是将 StringComparison.CurrentCultureIgnoreCase 作为第三个参数从 Expression.Call

传递给 string.Compare

代码:

// for InBetweenStr and NotInBetweenStr
public static Expression<Func<int>> StringComparisonExpression = () => string.Compare(null, null);
public static MethodInfo StringComparisonExpressionhMethodInfo = ((MethodCallExpression) StringComparisonExpression.Body).Method;


public static Expression InBetweenStr(this Expression value, Expression lowerBound, Expression upperBound)
{
    // zero constant expression
    var zeroExpr = Expression.Constant(0);

    return Expression.AndAlso(
        Expression.GreaterThanOrEqual(Expression.Call(StringComparisonExpressionhMethodInfo, value, lowerBound), zeroExpr),
        Expression.LessThanOrEqual(Expression.Call(StringComparisonExpressionhMethodInfo, value, upperBound), zeroExpr)
    );
}

修改 StringComparisonExpression 导致异常:

public static Expression<Func<int>> StringComparisonExpression = () => string.Compare(null, null, StringComparison.CurrentCultureIgnoreCase);

你可以这样得到三参数string.Compare方法的MethodInfo

private static readonly MethodInfo StringComparisonExpressionMethodInfo =
    typeof(string).GetMethod("Compare", new Type[] {
        typeof(string), typeof(string), typeof(StringComparison)
    });

有了这个 MethodInfo,您可以使用第三个参数调用该方法:

var ignoreCase = Expression.Constant(StringComparison.CurrentCultureIgnoreCase);
return Expression.AndAlso(
    Expression.GreaterThanOrEqual(Expression.Call(StringComparisonExpressionMethodInfo, value, lowerBound, ignoreCase), zeroExpr),
    Expression.LessThanOrEqual(Expression.Call(StringComparisonExpressionMethodInfo, value, upperBound, ignoreCase), zeroExpr)
);

因为您要为第三个参数传递一个常量,所以按照与 zeroExpr.

相同的方式制作 ignoreCase 常量表达式