2010-12-30 1 views
2

필터링 할 형식을 컴파일 타임에 알 수없는 경우이 식 작성기 클래스를 사용하여 람다 식을 동적으로 생성 할 수 있는지 궁금합니다.LINQ 식을 동적으로 작성/알 수없는 형식으로

나는 표현을 구성하는 방법,

public static Expression<Func<T, bool>> GetExpression<T>(IList<QueryFilter> filters) 

그리고 QueryFilter 객체를 가지고 당신이 전달되는 QueryFilters를 사용하여 객체 T를 필터링하는 새로운 표현을 생성 할 수 있습니다

public class QueryFilter 
{ 
    public string PropertyName { get; set; }  
    public ExpressionType OpType { get; set; } 
    public object Value { get; set; } 
} 

유형을 알 수없는 메소드를 개발하려고합니다.
public static Expression<Func<T,bool>> GetExpression(IList<QueryFilter> filters, Type type) 

그래서 내가 대신 코드를 지정할 필요없이,하는 System.Reflection 호출에서 매개 변수로 유형을 전달할 수 있습니다. 이 라인을 따라 예를 들어 뭔가

public static Expression NewExpression(IList<QueryFilter> filters, Type T) 
    { 
     return GetExpression<Type>(filters); 
    } 

를 들어 만약 그것의 가능한 유형은 일반 'T'를 대체 구문을 사용하는 방법? 나는 내가 <> 괄호 안에 런타임 동적 유형을 지정할 수 있다고 생각하지 않기 때문에, 다른 방법은 아마도 대신

Func<object,bool> 

를 사용하여, 거기?

답변

0

하는 DynamicExpression.ParseLambda

+0

이 작동합니다, 감사를 사용할 수 있습니다. 그러나 내가 주목 한 한 가지 문제는 "TimeOfAction> @ 0"과 같이 이진 람다 식의 문자열 표현을 지정하면 해당 식 대신 'GreaterThan'또는 'LessThan'이 작성된 식의 .ToString() 표현으로 표시됩니다. 상징. 그렇다면 이진 연산을 어떻게 동적으로 설정할 수 있습니까? – sean

+0

죄송합니다. 다른 질문을하셔야 할 수도 있습니다. –

0

작업을보십시오 당신은 하나 Predicate Builder 또는 Dynamic Linq Library (.NET 3.5).

+0

Dynamic Linq 라이브러리와 Linq.Expressions 네임 스페이스에 서로 다른 멤버가있는 DynamicExpression 클래스가있어 IDE에서 충돌에 대해 불만을 제기합니다. 당신은 어떻게 그것을 일반적으로 해결합니까? – sean

+0

@sean : MSDN 설명서를 보면 "DynamicExpression"클래스가 .NET Framework 4.0에 통합되어 일부 "향상된 기능"이있는 것으로 보입니다. 따라서 Dynamic Linq 라이브러리는 .NET 3.5에서만 수정되지 않고 작동합니다 –