2016-10-27 4 views
0

Je veux avoir la possibilité de construire la chaîne de propriétés à partir d'une expression donnée. J'ai pris la source pour la conversation d'ici (link).Execute/Invoke ConditionalExpression pour décider si utiliser la partie true ou false

Cela fonctionne plutôt bien lorsqu'il est utilisé comme décrit ici.

Mon problème est maintenant quand je passe une expression conditionnelle, par ex.

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

alors createChain est un bool et à l'intérieur du Foo le premier chèque est un expr != null d'aller plus loin.

Cependant, expr.Body.NodeType est maintenant ExpressionType.Conditional et je ne trouve pas la bonne façon d'exécuter/invoquer l'expression, donc je sais quelle partie (vrai ou faux) de l'expression je mettre pour me. J'ai ajouté case ExpressionType.Conditional: et j'ai coulé var ce = expr as ConditionalExpression. Comment puis-je obtenir l'expression correcte à utiliser pour me de ce comme l'un est le c.SomeProperty alors que l'autre serait null en fonction de la valeur de 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

Je ne trouve pas ce assez clair ... – meJustAndrew

Répondre

1

Essayez ceci:

  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

Cela jette 'InvalidCastException: Impossible de jeter l'objet de type 'System.Linq.Expressions.FieldExpression' taper 'System.Linq.Expressions.ConstantExpression'.' – KingKerosin

+0

Mis à jour. Bien que vous puissiez toujours avoir un problème si votre expression conditionnelle évalue à null comme évidemment qui ne sera pas convertie en MemberExpression –

+0

Merci. Utiliser un casting sûr et vérifier contre 'null' semble faire l'affaire pour mon cas – KingKerosin