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
常量表达式
这是我的表达式扩展方法,它向 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
常量表达式