표현식을 변환하는 방법 >은 술어로
-
10-07-2019 - |
문제
나는 수락하는 방법이있다 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;
제휴하지 않습니다 StackOverflow