创建一个使用 Any 的表达式

Create an expression that uses Any

我有一个常量字符串“ello orld”

我有一个 class,文本 属性 设置为“Hello World”;

public class Hi
{
   public String Text {get; set;} = "Hello World";
}

Hi hiObj = new Hi();

我想构建一个这样定义的置换算法:

"ello World".Split(" ").All(y => hiObj.Text.Split(" ").Any(x => x.Contains(y)));

我有一个这样定义的函数。

public override Expression GetExpression(MemberExpression member, ConstantExpression constant1)
{
...
}

在上面的函数中,member是指hiObj.Text,而constant1是指“ello World”。

如何形成这个表达式?

到目前为止我的尝试。

public class PermuteAlgorithm: OperationBase
{
     private readonly MethodInfo stringSplit = typeof(string).GetMethod("Split", new[]{ typeof(string), typeof(StringSplitOptions)});

     private readonly MethodInfo stringContainsMethod = typeof(string).GetMethod("Contains", new[]{ typeof(string)});

     private readonly MethodInfo enumerableAny= typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).First(x => x.Name == "Any" && x.GetParameters().Count() == 2);

public override Expression GetExpression(MemberExpression member, ConstantExpression constant1)
{
     Expression parameterY = Expression.Parameter(typeof(string), "y");
     Expression memberContains = Expression.Call(member, stringContainsMethod, parameterY);
     var anyLambda = Expression.Lambda<Func<String, bool>>(memberContains, (ParameterExpression)parameterY);

     Expression memberSplitExpression = Expression.Call(member, stringSplit, Expression.Constant(" "), Expression.Constant(StringSplitOptions.emoveEmptyEntries));

      //Error below statement
      Expression memberSplitAndAnyExpression = Expression.Call(memberSplitExpression, enumberableAny, anyLambda);
}

}

Enumerable.Any 是一种扩展方法。编译器允许您编写 thing.Any(...),但它实际上会在编译时将其转换为对 Enumerable.Any(x, ...) 的调用。

您正在尝试调用 memberSplitExpression 上的实例方法 Any,但您应该尝试调用静态方法 Enumerable.Any,将 memberSplitExpression 作为第一个参数。

类似于:

Expression.Call(enumberableAny, memberSplitExpression, anyLambda)