2017-11-08 2 views
-1

목록의 가치를 얻고 싶습니다. 이 같은 나의 방법 :C에서 Reflection을 사용하여 Expression의 Object.Value를 얻는 방법 #

private void predicateTest(Expression<Func<bool>> predicate) 
     { 
      var body = predicate.Body; 

      var binaryExpression = body as BinaryExpression; 
      var binaryBody= binaryExpression ??  
         Expression.MakeBinary(ExpressionType.Equal, 
         body, Expression.Constant(true)); 
      var left = binaryBody.Left; 
     } 

그리고 내 전화 : 그림을 다음과 같은

List<string> list = new List<string> { "doc", "exe", "jpg" }; 

predicateTest(() => list.Contains("sdf")); 

그리고 predicate.Body.Left 값입니다. predicateTest 메서드에서 목록의 값을 프로그래밍 방식으로 가져 오는 방법은 무엇입니까?

enter image description here

+0

당신은 (표현 방문자) (https://msdn.microsoft.com/en-us/library/system.linq.expressions.expressionvisitor (v = vs.110) .aspx)를 원할 것입니다. . 스택 오버플로에 대한 예제를 찾을 수 있습니다. –

+0

감사합니다. 나는 연구 할 것이다. –

답변

0

다음 패스 : 당신의 표정은 당신이 지시 한 것과 조금이라도 다른 형식 인 경우 물론

private List<string> predicateTest(Expression<Func<bool>> predicate) 
    { 
     var body = predicate.Body; 

     var binaryExpression = body as BinaryExpression; 
     var binaryBody = binaryExpression ?? 
        Expression.MakeBinary(ExpressionType.Equal, 
        body, Expression.Constant(true)); 
     var left = binaryBody.Left; 

     return Expression.Lambda(((MethodCallExpression)left).Object).Compile().DynamicInvoke() as List<string>; 
    } 

    [Test] 
    public void PredicateTest_ShouldFindList() 
    { 
     List<string> list = new List<string> { "doc", "exe", "jpg" }; 
     var result = predicateTest(() => list.Contains("sdf")); 
     Assert.That(list, Is.SameAs(result)); 
    } 

는, 당신은 다양한 예외를 얻을 것이다. 다양한 형식의 표현식에서 원하는 것을 구문 분석하는 기능은 Ed의 권장 사항 중 하나입니다.

+0

효과가 있습니다!. 정말 고맙습니다 –

관련 문제