代码之家  ›  专栏  ›  技术社区  ›  Node.JS

C#表达式类方法扩展,使字符串比较不区分大小写

  •  3
  • Node.JS  · 技术社区  · 7 年前

    这是我的表达式扩展方法 InBetweenStr 功能到 Expression ( System.Linq.Expressions.Expression )类别。然而,我想暗示字符串比较忽略大小写,所以我修改了 StringComparisonExpression 并添加了第三个参数: StringComparison.CurrentCultureIgnoreCase . 但代码当然不起作用,并抛出一个异常,表示:“为方法调用提供的参数数量不正确 Int32 Compare(System.String, System.String, System.StringComparison) ".

    所以我想知道除了传递之外,还有没有一种优雅的方法可以使字符串比较不区分大小写 字符串比较。当前文化识别酶 作为第三个参数 string.Compare 从…起 Expression.Call

    代码:

    // 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);
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Sergey Kalinichenko    7 年前

    你可以 MethodInfo 三个参数中的 string.Compare 方法如下:

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

    由于要为第三个参数传递一个常量,请 ignoreCase 和你做的一样的常量表达式 zeroExpr .