문제

나는 수락하는 방법이있다 Expression<Func<T, bool>> 매개 변수로. List.Find () 메소드에서 술어로 사용하고 싶지만 목록이 취하는 술어로 변환 할 수는 없습니다. 이것을하는 간단한 방법을 알고 있습니까?

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과 280Z28의 답변을 결합하여 이제 다음을 사용하고 있습니다.

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

    return list.Where(expression.Compile()).ToList();
}
도움이 되었습니까?

해결책

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

편집 : 의견에 따라 두 번째 줄에 대한 더 나은 답변이 있습니다.

Predicate<T> pred = func.Invoke;

다른 팁

이 방법에 대한 필요성이 보이지 않습니다. () 만 사용하십시오.

 var sublist = list.Where( expression.Compile() ).ToList();

또는 더 나은 방법으로 표현을 람다 인라인으로 정의하십시오.

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

언급되지 않은 또 다른 옵션 :

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

이것은 동일한 IL을 생성합니다

Func<T, bool> func = expression.Compile();
Predicate<T> predicate = func.Invoke;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top