2017-10-02 7 views
3

Je veux construire dynamiquement un arbre Expression en C# qui représente ce code:Expression.SwitchCase avec C# 7 modèle correspondant à

switch (x) 
{ 
    case A1 cx: Handle(cx); break; 
    case A2 cx: Handle(cx); break; 
} 

Jusqu'à présent, je quelque chose comme ceci:

Expression.Switch(xParameterExpression, 
    Expression.SwitchCase(
     method1CallExpression, /* test value expression - what to put here ?? */), 
    Expression.SwitchCase(
     method2CallExpression, /* test value expression - what to put here ?? */)); 

je pouvais également utiliser le Expression.TypeAs mais cela ne semble pas fonctionner. Je suspecte que j'ai besoin d'une expression semblable au if (x is A1 cx) { } conditionnel plutôt que le var cx = x as A1;. Je réalise que ce sont de nouvelles fonctionnalités C# 7.0 mais je me suis demandé si toutes les nouvelles fonctionnalités de langue sont ajoutées aux expressions?

+0

Pourriez-vous fournir un exemple de code plus détaillé s'il vous plaît, qui montre plus clairement ce que vous essayez d'accomplir? –

+0

Mon cas d'utilisation est de créer une méthode dynamique/délégué compilé contenant les instructions switch. Je n'ai pas beaucoup plus loin que cela pour un exemple de code mais cela me permettra de construire et d'exécuter une instruction basique tout au moment de l'exécution. – jamespconnor

+3

Le paquet 'System.Linq.Expressions' n'a pas été mis à jour depuis novembre 2016 donc je suppose qu'il ne contient pas le nouveau support de langage C# 7.0! – jamespconnor

Répondre

3

Aucune des fonctionnalités C# 7.0 ne prend en charge les arborescences d'expression à ce stade. Vous trouverez un certain nombre de requêtes de tirage du compilateur explicitement handle this (produire un diagnostic si vous avez essayé). Si cela est important pour vous, je vous suggère de déposer un problème sur le repo Roslyn (je ne pouvais pas trouver un existant) et de recueillir un certain soutien.