2016-11-02 50 views
1

我正在写一个共享代码库将在异步/等待和条件编译

  • 一个全新的便携式类库为移动设备和
  • 遗留项目中使用.NET 3.5中使用。

因此,我的代码中含有大量的那些:

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

这是重复的,因此,难看。

通常,如果某件事是重复的,解决办法是将它提取到一个方法。不幸的是,我没有看到如何做到这一点,因为(1)I 必须使用使用await来调用PCL情况下的方法和(2)I 不得使用在.NET 3.5中使用await,因为编译器可以没有办法。我倒是有类似的东西:

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 

但是,唉,没有在VB.NET语言中没有AwaitIfNet45OrHigher关键字。

我错过的任何其他解决方案(除了诉诸于T4宏)?

+0

为什么不使用ShowAlert和ShowAlertAsync两种方法,并且不能编译3.5的第二个方法? –

+0

@ScottChamberlain:这基本上就是我现在所拥有的东西(只是在第一个代码示例中用ShowAlert和AlertAsync在ShowAlertAsync中精神上代替了MessageBox.Show)。我仍然需要5行代码,并提到每个参数两次。我想要一行代码并提一次每个参数。 :-) – Heinzi

+0

您可以将Else和EndIf放在方法名称之后但在参数之前。 –

回答

-1

作为一般规则,不应使用条件编译符号。 例外可能是“#if DEBUG”

但是对于这样的事情,特别是像这样。您需要退后一步并遵循适当的.Net库架构。

这两件事情看起来可能相同,但它们完全不同。 您需要为.NET 4.5创建一个新的库 -yes当您拉入项目

时,您将有两个版本的项目,但是更清晰的文件将为您节省大量时间。 更不用说.net 3.5就在它的出门之外。 加上4.5中增加了一大堆非常棒的功能。也许是时候重新完成图书馆以获得最新和最好的功能。

要添加,处理器升级重写可以做到和平。只重写版本化项目中现在需要的函数,并在便携库中引用它们。

0

看看AsyncBridge,你只需要添加一个文件到您的项目中,以等待/异步在.NET 4.0/3.5中工作。

+0

您提供的链接仅仅是关于.NET 4.0,而不是.NET 3.5。 – Heinzi

+0

它应该与3.5一起工作。 – wdosanjos

+0

[NuGet for .NET 3.5上的AsyncBridge](https://www.nuget.org/packages/AsyncBridge.Net35/) – wdosanjos