2012-01-25 91 views
2

是否可以创建一个返回lambda表达式的方法?我找不到任何适当的例子。返回类型为“Expression”的方法

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

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

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

回答

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>> 
+0

我不认为第一个例子的目的是什么。你将如何检查该名称==名称? (在那里使用'T'?)当传递给'Where'时,第二个不会被编译。 – leppie

+0

你快4秒了。所以接受的答案是你的。 :-D –

+0

@ebeeb:上面的代码实际上是做你需要的吗? – leppie

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

Upvoted解决他的例子。 – Richard

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; 
} 

但我不能准确地了解你正在尝试用它做。

+0

对我的羞耻我当然是'Func '。 – StuffHappens

+0

1.错误的答案。 2.你输入的参数是错误的。下次更好运! – leppie

+0

我的目的是我有一个巨大的Linq声明与多个“Where”s。根据调用此语句的几个参数,“Where”中只有一个表达式有所不同。取代整个语句的代码,我只是根据参数获得匹配的表达式。 –

0

你必须返回Func键<>自IEnumerable的希望之一,因为在你的例子那就是:

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

错误的答案。你缺少'表达式'... – leppie

+0

不需要使用IEnumerable的参数,但好吧,问题是如何返回一个表达式,我想我没有回答 – Daniel

0

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

如果IQueryable<T>的方法预计为Expression<Func<T, bool>>,那么GetLambdaExpression()必须返回Expression<Func<T, bool>>

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