2012-01-25 33 views
2

ラムダ式を返すメソッドを作成できますか?私は適切な例を見つけることができませんでした。戻り値の型が "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は(私がupvotedている)の下に言及したものを使用する必要があります

<Func<TypeOflistElement,bool>> 
+0

私はgrokを目的としていません。あなたはその名前==名前をどうやってチェックしますか? ( 'T'は何を使用していますか?)また、' Where'に渡されるとコンパイルされません。 – leppie

+0

あなたは4秒も早くなりました。受け入れられた答えはあなたのものです。 :-D –

+0

@ebeeb:上記のコードが実際に必要なコードを実行していますか? – leppie

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

アップして、彼の例を解決しました。 – Richard

0

あなたはこの

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

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

ようFunc<bool, T>型を返すことができますしかし、私は、あなたがそれをやろうとしている正確に理解することはできません。

+0

私には恥ずかしくて、私はもちろん 'Func 'と書いています。 – StuffHappens

+0

1.間違った答え。あなたが入力したパラメータが間違った方法です。次回は運がよかった! – leppie

+0

私の目的は、 "Where" sという倍数の巨大なLinqステートメントがあることです。このステートメントを呼び出すいくつかのパラメータに応じて、「Where」の1つの式だけが異なります。文全体のコードを再現するのではなく、パラメータに応じて一致する式を取得するだけです。 –

0

あなたはIEnumerableを、1つを期待するので、>のFunc <を返す必要が、あなたの例のように、それは次のようになります。

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

間違った答え。あなたは 'Expression'がありません... – leppie

+0

IEnumerableのparamとして使う必要はありませんが、問題は式を返す方法でした。私は答えなかったと思います – Daniel

0
IEnumerable<T>ための方法が Func<T, bool>法のために委任を期待

、そうGetLambdaExpression()は返さなければなりませんFunc<T, bool>

IQueryable<T>のメソッドがExpression<Func<T, bool>>であるとすると、GetLambdaExpression()Expression<Func<T, bool>>を返す必要があります。

Expressionは、Compile()メソッドを呼び出すことによってデリゲートに変換できます。

関連する問題