2016-10-27 1 views
0

주어진 표현식에서 propertyname-chain을 생성 할 수 있습니다. 나는 대화의 출처를 여기 (link)에서 가져왔다.Execute/Invoke 조건부 표현을 사용하여 참 또는 거짓 부분을 사용할지 결정합니다.

설명 된대로 사용하면 꽤 잘 작동합니다.

내 조건은 이제 조건식을 전달할 때입니다.

Foo ((MyClass c) => createChain? c.SomeProperty : null); 반면 createChain

bool이며 expr != null 추가 이동을 위해 내부 Foo 제 1 체크이다.

그러나, expr.Body.NodeType 지금 ExpressionType.Conditional 내가 내가 me 설정해야합니다 식의 (true 또는 false) 어느 부분을 알 수 있도록 표현을 호출/실행하는 올바른 방법을 찾을 수 없습니다.

나는 case ExpressionType.Conditional:을 추가했으며 캐스팅 된 var ce = expr as ConditionalExpression을 추가했습니다. me에 대해 ce에서 올바른 표현식을 얻으려면 c.SomeProperty이고 다른 하나는 이고 createChain 값에 따라 달라집니다.

case ExpressionType.Conditional: 
    var ce = expr.Body as ConditionalExpression; 
    me = (MemberExpression) (ce != null && /*ce.Invoke()*/ ? ce.IfTrue : ce.IfFalse); // here i need to know if to use true or false part of expr 
    break; 
+0

내가 ...이 충분히 명확한 – meJustAndrew

답변

1

이 시도 :

  case ExpressionType.Conditional: 
       var ce = expr.Body as ConditionalExpression; 
       var cond = (MemberExpression)ce.Test; 
       me = (MemberExpression) (ce != null && (bool)(Expression.Lambda(cond).Compile().DynamicInvoke()) ? ce.IfTrue : ce.IfFalse); 
       break; 
+0

을 찾을 수없는이'발생 InvalidCastException이 : 입력 유형 'System.Linq.Expressions.FieldExpression'의 개체를 캐스팅 할 수 없습니다 'System.Linq.Expressions.ConstantExpression '. – KingKerosin

+0

업데이트 됨. 조건부 표현식이 null로 평가되는 경우에도 여전히 문제가 발생할 수 있지만 이는 MemberExpression –

+0

에 전송하지 않습니다. 안전한 캐스팅을 사용하고 'null'에 대해 확인하는 것은 내 경우에 트릭을 수행하는 것 같습니다. – KingKerosin

관련 문제