J'ai besoin de créer une expression dynamique Linq et j'ai commencé à travailler avec de nombreux exemples. J'ai testé certains et certains travaillent et certains pas. Dans ce cas, je veux créer une méthode qui ressemble à: maintenant j'ai écrit ce qui suit: p> maintenant il jette < Code> InvalidOperationException Code>: P> ne peut pas sauter à l'étiquette "Label" ` p>
BlockQuote> Qu'est-ce qui ne va pas? J'ai seulement besoin d'un retour vrai ou de faux. P> p>
3 Réponses :
Essayez d'utiliser returnTarget code> n'est actuellement référencé par votre if / then / else instruction. L'étiquette est pas placé dans la déclaration nulle part. Donc, il ne sait pas où sauter. L'étiquette est uniquement défini et référencé, mais pas placé.
Expression.Block code> pour combiner votre lambda et l'étiquette. P>
Expression.Lambda<Action<int>>(
Expression.Block(
this.TheExpression,
Expression.Label(returnTarget)
),
new ParameterExpression[] { para }
).Compile()(5);
Vous devez changer quelques points:
Placez l'étiquette de retour au bas de votre fonction dans une expression de bloc, comme suggéré René. C'est ici que votre relève de votre Déclarez la Lambda en tant que type déclarer le Fournissez une valeur par défaut pour l'étiquette finale (= la valeur de retour de votre fonction si l'étiquette est atteinte par le flux de contrôle normal au lieu d'une instruction code> de retour de code>). P>
retour code> sautera. P> li>
Func
returntarget code> étiquette comme type
bool code>. Étant donné que la valeur de retour d'une expression de bloc est la valeur de sa dernière instruction, l'étiquette doit être du type correct. P> LI>
Si vous regardez un code IL compilé, vous pouvez voir qu'il n'a jamais vraiment quitté ...;)
Si vous avez une déclaration de condition simple comme celle-ci:
Expression condition; Expression expression1; Expression expression2; /* ... */ Expression body = Expression.Condition( test: condition, ifTrue: expression1, ifFalse: expression2);
Pouvez-vous nous en dire un peu plus sur ce que vous essayez d'atteindre? Par exemple, pourquoi avez-vous besoin de créer de manière dynamique cette expression ... et pourquoi devez-vous utiliser des étiquettes et si else quand vous pourriez écrire: chèque Bool public (int totvar) {retour I> 2; }