2012-01-25 90 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()方法轉換爲委託。