protected override Expression VisitMethodCall(MethodCallExpression methodCall) { string method = methodCall.Method.Name; switch (method) { case "Contains": { Expression o = methodCall.Object; string pattern = methodCall.GetArgumentValue <string>(0); HandleRegexMethodCallExpression(o, pattern, false); return(methodCall); } case "StartsWith": { object[] args = new object[] { true, StringComparison.CurrentCultureIgnoreCase, StringComparison.InvariantCultureIgnoreCase }; Expression o = methodCall.Object; string pattern = "^" + methodCall.GetArgumentValue <string>(0); bool ignoreCase = methodCall.HasArgumentValueFromAlternatives(1, args); HandleRegexMethodCallExpression(o, pattern, ignoreCase); return(methodCall); } case "EndsWith": { object[] args = new object[] { true, StringComparison.CurrentCultureIgnoreCase, StringComparison.InvariantCultureIgnoreCase }; Expression o = methodCall.Object; string pattern = methodCall.GetArgumentValue <string>(0) + "$"; bool ignoreCase = methodCall.HasArgumentValueFromAlternatives(1, args); HandleRegexMethodCallExpression(o, pattern, ignoreCase); return(methodCall); } case "IsMatch": { if (methodCall.Method.DeclaringType == typeof(Regex)) { Expression o = methodCall.Arguments[0]; string pattern = methodCall.GetArgumentValue <string>(1) + "$"; RegexOptions options = methodCall.GetArgumentValue(2, RegexOptions.None); HandleRegexMethodCallExpression(o, pattern, options.HasFlag(RegexOptions.IgnoreCase)); return(methodCall); } break; } } throw new NotSupportedException(methodCall.Method.ToString()); }