【发布时间】:2016-11-02 16:38:37
【问题描述】:
我正在编写一个共享代码库,将用于
- 适用于移动设备的全新可移植类库和
- 使用 .NET 3.5 的旧项目。
因此,我的代码包含很多:
#If PCL Then
Await AlertAsync("...some message...", "...some title...")
#Else
MessageBox.Show("...some message...", "...some title...")
#End If
这是重复的,因此是丑陋的。
通常,如果某些内容重复,解决方案是将其提取到方法中。不幸的是,我在这里看不到如何执行此操作,因为 (1) 我 必须 使用 await 在 PCL 案例中调用该方法,并且 (2) 我 不得 > 在 .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 宏)?
【问题讨论】:
-
为什么没有两个方法,ShowAlert 和 ShowAlertAsync 并且不为 3.5 编译第二个?
-
@ScottChamberlain:这基本上就是我现在所拥有的(在第一个代码示例中,将 MessageBox.Show 替换为 ShowAlert 并将 AlertAsync 替换为 ShowAlertAsync)。我仍然需要 5 行代码并两次提及每个参数。我想要一行代码并提到每个参数一次。 :-)
-
Else 和 EndIf 可以放在方法名之后,参数之前。
-
如果您正在编写一个库,您能否将“向用户显示警报并等待他们确认”作为您的消费者必须提供的回调/事件?这样一来,您就不会被特定的 UI 技术(例如
MessageBox)所束缚,这意味着您的库也可以更广泛地适用。 -
@Damien_The_Unbeliever:当然,我可以做到。尽管如此,最初的问题仍然存在:我需要在 .NET 4.5 中使用
await调用回调,而在 .NET 3.5 中无需等待。
标签: .net vb.net async-await code-reuse conditional-compilation