2017-10-02 3 views
3

Ich möchte dynamisch eine Expression Baum in C# erstellen, die diesen Code darstellt:Expression.SwitchCase mit C# 7 Musterabgleich

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

Bisher habe ich so etwas wie dieses:

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

ich konnte Verwenden Sie auch die Expression.TypeAs, aber es scheint nicht zu funktionieren. Ich vermute, ich brauche einen Ausdruck ähnlich dem bedingten statt dem var cx = x as A1;.

Ich realisiere, das sind neue C# 7.0-Funktionen, aber gefragt, ob alle neuen Sprachfunktionen zu Expressions hinzugefügt werden?

+0

Könnten Sie bitte ein detaillierteres Codebeispiel angeben, das deutlicher zeigt, was Sie erreichen möchten? –

+0

Mein Anwendungsfall besteht darin, eine dynamische Methode/einen kompilierten Delegaten zu erstellen, der die switch-Anweisungen enthält. Ich habe nicht viel weiter als das für ein Codebeispiel, aber es wird mir erlauben, eine grundlegende switch-Anweisung zur Laufzeit zu erstellen und auszuführen. – jamespconnor

+3

Das 'System.Linq.Expressions'-Paket wurde seit November 2016 nicht aktualisiert, daher nehme ich an, dass es die neue C# 7.0-Sprachunterstützung nicht enthält! – jamespconnor

Antwort

3

Keines der Features von C# 7.0 unterstützt an diesem Punkt Unterstützung in Ausdrucksbäumen. Sie werden eine Anzahl von Compiler Pull Requests finden, die explizit handle this (erzeugen Sie eine Diagnose, wenn Sie es versuchten).

Wenn dies für Sie wichtig ist, würde ich vorschlagen, dass Sie ein Problem im Roslyn Repo einreichen (ich konnte kein existierendes finden) und etwas Unterstützung sammeln.