2009-08-01 17 views
42

Bir parametre olarak bir Expression<Func<T, bool>> kabul eden bir yöntem var. List.Find() yönteminde bir yüklem olarak kullanmak istiyorum, ancak bunu hangi Listenin alacağını bir Tahmine dönüştüremiyorum. Bunu yapmanın basit bir yolu biliyor musunuz?Bir Expression <Func <T, bool>> nasıl bir Predicate dönüştürmek için <T>

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() 
{ 
    var list = GetList<T>(); 

    var predicate = [what goes here to convert expression?]; 

    return list.Find(predicate); 
} 

tvanfosson ve 280Z28 gelen cevapları birleştiren Güncelleme

, şimdi bu kullanıyorum:

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() 
{ 
    var list = GetList<T>(); 

    return list.Where(expression.Compile()).ToList(); 
} 

cevap

46
Func<T, bool> func = expression.Compile(); 
Predicate<T> pred = t => func(t); 

Edit: Yorumlar başı biz saniye daha iyi bir cevabı var satır:

Predicate<T> pred = func.Invoke; 
+0

Mükemmel aynı IL üretir

Func<T, bool> func = expression.Compile(); Predicate<T> predicate = new Predicate<T>(func); 

! Teşekkürler! –

+7

Veya: pred = func.Invoke; –

+0

Evet, func.Invoke daha iyi görünüyor. –

25

Bu yönteme olan ihtiyacı görmüyorum. Sadece Where() kullanın.

Veya daha da iyisi, ifadeyi lambda satır içi olarak tanımlayın. söz edilmemiştir

var sublist = list.Where(l => l.ID == id).ToList(); 
+1

Heh, true. Dar okuma için aldığım şey bu. –

+0

Find() yerine Where() öğesini kullanmak, benim yapmam gereken şey. Ancak ilk örneğiniz, yalnızca ifade yerine expression.Compile() yöntemini kullanmalıdır. Teşekkürler. –

+0

Güncellendi. Nerede bir Func alır gerçeği ihmal etti. – tvanfosson

22

Başka seçenekleri: Bu

Func<T, bool> func = expression.Compile(); 
Predicate<T> predicate = func.Invoke; 
+4

neden sadece 12 oyu var? nankör köylüler! O, Jon Skeet. Onun sözlerini Heed !! – jokab

İlgili konular