是否可以创建一个返回lambda表达式的方法?我找不到任何合适的例子。
当然,以下语法不起作用。这只是想象我的想法:
// Executed code
var filteredList = listWithNames.Where(GetLambdaExpression("Adam"));
// method
public Expression GetLambdaExpression(string name)
{
return listElement => listElement.Name == name;
}
答案 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()
方法转换为委托。