给定
string[] stringArray = { "test1", "test2", "test3" };
然后返回 true:
bool doesContain = stringArray.Any(s => "testa test2 testc".Contains(s));
我的最终目标是制作一个 linq 表达式树。问题是我如何获得的方法信息"Any"
?以下不起作用,因为它返回 null。
MethodInfo info = typeof(string[]).GetMethod("Any", BindingFlags.Static | BindingFlags.Public);
进一步说明:
我正在创建搜索功能。我使用 EF,到目前为止,使用 linq 表达式树可以创建动态 lambda 表达式树。在这种情况下,我有一个字符串数组,其中任何字符串都应该出现在描述字段中。进入该Where
子句的工作 lambda 表达式是:
c => stringArray.Any(s => c.Description.Contains(s));
因此,要制作 lambda 表达式的主体,我需要调用"Any"
.
最终代码:
感谢 I4V 的回答,创建表达式树的这一部分现在看起来像这样(并且有效):
//stringArray.Any(s => c.Description.Contains(s));
if (!String.IsNullOrEmpty(example.Description))
{
string[] stringArray = example.Description.Split(' '); //split on spaces
ParameterExpression stringExpression = Expression.Parameter(typeof(string), "s");
Expression[] argumentArray = new Expression[] { stringExpression };
Expression containsExpression = Expression.Call(
Expression.Property(parameterExpression, "Description"),
typeof(string).GetMethod("Contains"),
argumentArray);
Expression lambda = Expression.Lambda(containsExpression, stringExpression);
Expression descriptionExpression = Expression.Call(
null,
typeof(Enumerable)
.GetMethods()
.Where(m => m.Name == "Any")
.First(m => m.GetParameters().Count() == 2)
.MakeGenericMethod(typeof(string)),
Expression.Constant(stringArray),
lambda);}
然后descriptionExpression
进入更大的 lambda 表达式树。