2016-11-02 13 views
1

ich eine gemeinsame Code-Bibliothek zu schreiben, die Async/erwarten und bedingte Kompilierung

  • eine glänzende neue portable Klassenbibliothek für mobile Geräte in

    verwendet werden und
  • ein Legacy-Projekt .NET 3.5 verwenden.

So enthält mein Code eine Menge derer:

#If PCL Then 
    Await AlertAsync("...some message...", "...some title...") 
#Else 
    MessageBox.Show("...some message...", "...some title...") 
#End If 

, die sich wiederholt und damit hässlich.

Normalerweise, wenn sich etwas wiederholt, ist die Lösung, es zu einer Methode zu extrahieren. Leider sehe ich hier nicht, wie man das macht (1) I mussawait verwenden, um die Methode im PCL-Fall aufzurufen und (2) I muss nicht in .NET 3.5 await verwenden, da der Compiler kann geh nicht damit um. Ich würde Liebe, so etwas haben:

AwaitIfNet45OrHigher ShowAlert("...some message...", "...some title...") 

... 

#If PCL Then 
    Private Async Function ShowAlert(...) As Task 
     ...async implementation... 
    End Sub 
#Else 
    Private Sub ShowAlert(...) 
     ....NET 3.5 implementation... 
    End Sub 
#End If 

Aber leider gibt es kein AwaitIfNet45OrHigher Schlüsselwort in der VB.NET Sprache.

Jede andere Lösung, die ich verpasst habe (abgesehen von der Verwendung von T4-Makros)?

+0

Warum haben Sie nicht zwei Methoden, ShowAlert und ShowAlertAsync und kompilieren nicht die zweite für 3.5? –

+0

@ScottChamberlain: Das ist im Grunde, was ich gerade habe (ersetzen Sie einfach MessageBox.Show mit ShowAlert und AlertAsync mit ShowAlertAsync im ersten Codebeispiel). Ich brauche immer noch 5 Codezeilen und erwähne jeden Parameter zweimal. Ich möchte eine Codezeile und erwähne jeden Parameter einmal. :-) – Heinzi

+0

Sie könnten Else und EndIf nach dem Methodennamen aber vor den Parametern setzen. –

Antwort

-1

Als allgemeine Faustregel sollten Conditional Compile-Symbole niemals verwendet werden. Eine Ausnahme könnte sein "#if DEBUG"

Aber für solche Dinge, vor allem so. Sie müssen zurücktreten und der richtigen .Net-Bibliotheksarchitektur folgen.

Die zwei Dinge mögen gleich aussehen, aber sie sind völlig unterschiedlich. Sie benötigen eine neue Bibliothek für .NET 4.5 erstellen -yes Sie zwei Versionen des Projekts für eine Weile haben, wie Sie in den Einzelteilen

ziehen aber sauberer Dateien werden Sie so viel Zeit auf lange Sicht speichern. Nicht zu vergessen .net 3.5 ist auf dem Weg zur Tür. plus es gibt eine ganze Reihe von wirklich tollen Funktionen in 4.5 hinzugefügt. Vielleicht ist es an der Zeit, die Bibliothek komplett zu überarbeiten, um die neuesten und besten Funktionen zu erhalten.

Um hinzuzufügen, kann ein Prozessor-Upgrade-Neuschreiben Peacemill erfolgen. Schreiben Sie nur die Funktionen neu, die Sie jetzt in einem versionierten Projekt benötigen, und verweisen Sie auf beide in der portablen Bibliothek.

0

Werfen Sie einen Blick auf AsyncBridge, Sie müssen nur eine Datei zu Ihrem Projekt hinzufügen, um in .NET 4.0/3.5 auf async/async zu arbeiten.

+0

Der von Ihnen angegebene Link redet nur von .NET 4.0, nicht von .NET 3.5. – Heinzi

+0

Es funktioniert angeblich auch mit 3.5. – wdosanjos

+0

[AsyncBridge auf NuGet für .NET 3.5] (https://www.nuget.org/packages/AsyncBridge.Net35/) – wdosanjos