2017-05-20 1 views
-1

내가 코드를 작성했습니다,하지만 Expression.Call 메서드를 호출 할 때, 그것은 오류를 던지고의 C#의 LINQ 식 트리

listInstance.Exists(c=>c.Age=-40) 

같은의 LINQ 식 트리를 형성하고 싶습니다 (사용하여 목록에서 검색이 방법이 존재) .

listInstance.Exists(c=>c.Age=40) 

변화 그것에 :

listInstance.Exists(c => c.Age == 40) 
+0

Exists라는 이름으로 새 Extension 메서드를 만들려고하십니까? – mvermef

+0

아니요 식 트리를 사용하여 List 클래스의 Exists 메서드를 사용하려고합니다. –

+0

@ KannanSrinivasan : 왜 그래도됩니까? 기존 방법으로는 할 수없는, 여기서 성취하려는 것은 무엇입니까? 왜 기존의'.Exists()'또는 간단한 LINQ'.Any()'를 사용하지 않겠습니까? – Flater

답변

-1

보인다 왜 람다를 Exists으로 전달하는 대신 표현식 트리를 사용하고 싶은지 명확하지 않지만

이제
static LambdaExpression MakeExistsExpression(int age) 
{ 
    Expression<Func<List<Student>, bool>> func= (listInstance) => listInstance.Exists(c => c.Age == age); 
    return (LambdaExpression)func; 
} 

당신이 말할 수 있습니다 :

var func = MakeExistsExpression(40); 
var lambda = (Func<List<Student>,bool>)func.Compile(); 
bool found = lambda(students); 

어디 당신은 당신을 위해 무거운는 않는 컴파일러시키는하여 Expression 나무를 직접 구축 할 필요없이이 작업을 수행 할 수있는 다음 요구하고 s의 students은 귀하가 어딘가에서 유래 한 학생 목록입니다.

+0

응답을 주셔서 감사합니다. c => c.Age == 40을 포함했지만 여전히 Expression.Call이 오류를 발생시킵니다. var e1 = Expression .Lambda (expr, new ParameterExpression [] {parameter}); var left = Expression.Call (slInstance, methodInfo, e1); –

+0

질문의 코드에 결함이 있음을 지적했지만 질문에 대한 대답은 아닙니다. – Flater

1

그것은이다 당신이 당신의 표현에 등호를 놓친처럼 내가 작성한 코드는 여기에

,

private static string GetExprString<T>(List<Student> listInstance,int valueExpr){ 

    var methodInfo = typeof(List<Student>).GetMethod("Exists",new Type[] { typeof(Predicate<Student>)});    

    var parameter = Expression.Parameter(typeof(Student), "c"); 
    var masterProperty = Expression.Property(parameter, typeof(Student).GetProperty("Age")); 
    var slInstance = Expression.Constant(sList); 

    var expr = Expression.Equal(masterProperty, Expression.Constant(valueExpr)); 
    e1 = Expression.Lambda(expr, new ParameterExpression[] {parameter }); 
    var left = Expression.Call(slInstance, methodInfo, e1); 

    return string.empty; 
} 
+1

바로 내가 입력 한 것입니다. 컴파일러를 사용할 수있을 때 불필요하게 수식 트리를 수동으로 만들려는 사람들이 너무 많습니다. –