2016-08-05 21 views
4

Ich versuche, ein "return if"/"Rückgabewert if" ohne einen anderen Fall zu implementieren, da ich nur einen Wert zurückgeben oder zurückgeben möchte, wenn eine Bedingung gültig ist.Erweitern C# -Syntax mit Roslyn

Ich weiß, es gibt die if (condition) return; oder if (condition) return value;, aber ich möchte den Code ein bisschen sauberer und es wäre schön, diese Syntax zu haben, da es besser lesbar ist.

Ich hörte mit Roslyn das ist möglich und lies die Frage mit seinen Antworten hier: Is there a way to implement custom language features in C#? aber ich habe keine Ahnung, wie man es implementiert.

So würde der Code so etwas wie diese:

public class Testclass 
{ 
    public static void Main(String[] args) 
    { 
     Testclass t = new Testclass(); 
     t.TestMyClassWithVoid(); 
     bool success = t.TestMyClassWithInt(3) == 3; 
     bool fail = t.TestMyClassWithInt(2) == 2; 
    } 

    public void TestMyClassWithVoid() 
    { 
     int value = GetValueFromSomeWhere(); 
     return if value == 3; 

     DoSomeOtherStuffSinceValueIsNotThree(); 
    } 

    public int TestMyClassWithInt(int value) 
    { 
     return value if value == 3; 

     DoSomeOtherStuffSinceValueIsNotThree(); 
     return -1; 
    } 
} 

eine Idee, wie ich dieses Problem lösen könnte? Ich fing an, mit dem Roslyn.Compilers.CSharp -namespace zu versuchen, aber ich habe keine Ahnung, wie man mit dem Implementieren beginnt.

+0

laufen, was ich aus dem Code verstehen „zurück, wenn Wert == 3; " Wenn der Wert 3 ist, möchten Sie den Restcode der Methode nicht ausführen, richtig? –

+0

@AnkitkumarBhatt yep! das gleiche wie 'if (value == 3) return;' aber andersherum –

+0

Sie können goto mit label verwenden, setzen Sie einfach goto in die if-Bedingung. Deine Absicht wird auf diese Weise gelöst, denke ich. –

Antwort

1

Wenn Sie die richtige IL dafür generieren können, sollte dies funktionieren. Da dies keine neue CLR-Funktion ist, brauchen Sie nichts mit dot net core zu tun, nur Roslyn.

Um das zu tun haben Sie zwei Möglichkeiten,

Man ist Roslyn zu lassen wie es ist und schreiben Sie Ihre neue Syntax in der # Syntax entspricht C und dann als reguläres kompiliert.

Zweite Option, weil Roslyn eine Open Source ist, ist es, die Fähigkeit hinzuzufügen, um Ihnen neue Syntax zu Ihrem eigenen Roslyn zu kompilieren und Ihren Code damit zu kompilieren.

+0

Ich nahm die zweite Option und kam am letzten Wochenende endlich ans Werk. Vielen Dank! –

+0

Können Sie erweitern, was Sie damit gemeint haben? Schreiben Sie Ihre neue Syntax in die entsprechende C# -Syntax um und kompilieren Sie sie als regulär? Meinst du das mit Roslyn? Ich versuche herauszufinden, ob es möglich ist, Roslyn auf eine transparente Weise zu verwenden (dh es erscheint nicht als eine Art IDE-Vorschlag, aber die Umwandlung geschieht transparent zur Kompilierzeit?) – user1454265

+0

@ user1454265 Ich meine dass Sie schreiben können, was Sie wollen, aber bevor Sie kompilieren, müssen Sie den Code in einen gültigen C# -Code umwandeln. Sie können es mit Roslyn Code Fix oder mit separatem Prozess machen. Aber soweit ich weiß, können Sie es in den VS-Build-Prozess integrieren. –

0

Hier ist ein alternativer Vorschlag, der für jemanden funktionieren könnte, der nach Erweiterungspunkten in Roslyn sucht. Es kann sogar als kleines Paket angeboten werden! Erstellen Sie einen Analysator und einen Code-Fix-Anbieter für Ihre Syntax.

Im Wesentlichen erhalten Sie eine rote, verschnörkelte Linie unter jeder Syntax Ihrer Wahl, mit einem Auto-Fix-Hinweis, mit dem Sie es in das normale C# -Aquivalent umwandeln können.

Es könnte auch zur Validierung der Nutzung Ihrer Bibliothek verwendet werden, die Überprüfung, dass die richtigen Attribute in den richtigen Stellen sind, gemeinsamen Code erkennen Gerüche usw.

auf diesem Posten mehr auf Codeanalysatoren Lesen up: https://msdn.microsoft.com/en-us/magazine/dn879356.aspx

eine kurze Zusammenfassung dieser Verbindung (aber keineswegs ein Ersatz):

  • installieren VS SDK, Roslyn SDK Compiler Platform SDK
  • neues Projekt erstellen: A nalyzer mit Code Fix (NuGet + VSIX) Vorlage.
  • Es wurden 3 Proben auf sein, wie ein Analysator/code fix Anbieter
  • Stellen Sie das VSIX Projekt als Startprojekt erstellen und