返回类型为“Expression”的方法

时间:2012-01-25 11:23:58

标签: c# linq

是否可以创建一个返回lambda表达式的方法?我找不到任何合适的例子。

当然,以下语法不起作用。这只是想象我的想法:

// Executed code
var filteredList = listWithNames.Where(GetLambdaExpression("Adam"));

// method
public Expression GetLambdaExpression(string name)
{
    return listElement => listElement.Name == name;
}

5 个答案:

答案 0 :(得分:4)

您可以创建返回表达式的函数,例如谓词构建器中的一个简单示例:

public static Expression<Func<T, bool>> True<T>() { return param => true; }

或此表达式构建器:

static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
        {
                      var map = first.Parameters
                .Select((f, i) => new { f, s = second.Parameters[i] })
                .ToDictionary(p => p.s, p => p.f);

             var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);

             return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
        }

在你的示例案例中你应该使用Leppie在下面提到的内容(我已经投票)

<Func<TypeOflistElement,bool>>

答案 1 :(得分:1)

public Expression<Func<TypeOflistElement,bool>> GetLambdaExpression(string name)
{
    return listElement => listElement.Name == name;
}

答案 2 :(得分:0)

您可以像这样返回Func<bool, T>类型

// Executed code
var filteredList = listWithNames.Where(GetLambdaExpression("Adam"));

// method
public Func<bool, ListElementTypeName> GetLambdaExpression(string name)
{
    return listElement => listElement.Name == name;
}

但我无法理解你究竟想用它做什么。

答案 3 :(得分:0)

你必须返回Func&lt;&gt;因为IEnumerable需要一个,如你的例子那样:

 public Func<String,Bool> (string name){..}

答案 4 :(得分:0)

IEnumerable<T>的方法需要Func<T, bool>方法的委托,因此GetLambdaExpression()必须返回Func<T, bool>

IQueryable<T>的方法需要Expression<Func<T, bool>>,因此GetLambdaExpression()必须返回Expression<Func<T, bool>>

Expression可以通过调用Compile()方法转换为委托。