在动态linq查询中调用Regex.IsMatch().这是我尝试过的方法:ParameterExpressionparameter1=System.Linq.Expressions.Expression.Parameter(typeof(EventListItem));ParameterExpressionparameter2=System.Linq.Expressions.Expression.Parameter(typeof(Regex));返回System.Linq.Dynamic.DynamicExpression.ParseLambda(new[]{parameter1,parameter2},null,compilableExpression);在本例中,Category是EventListItem的一个属性。调用ParseLambda()会抛出此异常:Unknownidentifier'Regex'。有没有办法调用该方法?我遇到了Expression.Call()方法,但我不确定这是否是我正在寻找的方法。任何帮助表示赞赏。我没有经常使用System.Linq.Dynamic,但这里有一种方法可以让您的示例正常工作:1-您实际上只有一个输入对象,您的EventListItem,因此删除参数2(regex):stringcompilableExpression="Regex.IsMatch(Category.ToLower(),"\bSomeCat\b",RegexOptions.Compiled)==true";ParameterExpressionparameter1=System.Linq.Expressions.Expression.Parameter(typeof(EventListItem));返回System.Linq。Dynamic.DynamicExpression.ParseLambda(new[]{parameter1},null,compilableExpression);2–DynamicExpression.ParseLambda()用于从输入对象读取属性和方法。在其他类上使用方法(此处:Regex.IsMatch()仅限于Regex.IsMatch()预定义类,默认情况下Regex不是其中之一。因此我们需要让解析器知道“Regex”是一个类而不是EventListItem上的属性。假设您在项目中包含了DynamicLinq.cs文件,这可以通过将Regex(和RegexOptions)添加到内部ExpressionParser.predefinedTypes数组来完成:staticreadonlyType[]predefinedTypes={typeof(Object),typeof(Boolean),...typeof(System.Text.RegularExpressions.Regex),typeof(System.Text.RegularExpressions.RegexOptions),};Edit:complexparametervalues如果我们需要在方法调用中包含更复杂的参数,比如结合RegexOptionsEnum;RegexOptions.编译|RegexOptions.IgnoreCaseRegexOptions.已编译|RegexOptions.IgnoreCase,ParseLambda也接受值列表。我们预先准备合并的枚举并将其提交到这个值列表中。在compilableExpression中,我们为提交的值包含了占位符,索引顺序与我们提交它们的顺序相同(这里我们只有一个值-索引0)varoptions=RegexOptions.Compiled|RegexOptions.IgnoreCase;stringcompilableExpression="Regex.IsMatch(Category.ToLower(),"\bSomeCat\b",@0)==true";ParameterExpressionparameter1=SLE.Expression.Parameter(typeof(EventListItem));返回SLD.DynamicExpression.ParseLambda(new[]{parameter1},null,compilableExpression,options);额外:因为在compilableExpression中不再直接引用RegexOptions类/枚举,我们也不再需要在ExpressionParser.predefinedTypes中包含RegexOptions。以上就是C#学习教程:在动态linq查询中调用Regex.IsMatch(),分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表侵权,请点击右边联系管理员删除。如需转载请注明出处:
