就是众所周知,这个问题主要是学术上的,即使我试图在现实世界的解决方案中使用这个概念。我意识到这个例子是人为的,但我相信这个概念是有效的。
我想写一些像这样流利的代码:
copy(my_first_file).to(my_second_file)
简短,易于阅读和理解,完全合法。所以我定义了这样的复制方法:
Private Function copy(FilePath as String) As Object
Return New With {.to = New Action(Of String)(Function(x) my_real_copy_method(FilePath,x))}
End Function
我意识到我不能将匿名类型强制转换为特定类型(比如实现接口或其他类),我不希望定义特定类的开销只是为了匹配我想要的流畅名称实际的方法名称。所以我能够让代码像这样工作:
copy(my_first_file).to.Invoke(my_second_file)
因此,那里没有IntelliSense或类型感知,我必须包含Invoke才能运行该方法。在这些约束条件下,如何获得更多类型安全性并排除Invoke方法:
我知道这听起来非常苛刻,如果我遇到困难,可以随叫“公牛”!
提前致谢。
答案 0 :(得分:3)
由于VB对泛型方法没有返回类型推断,即使没有歧义,也有没有的方法。
你可以有一个强类型函数,它使用泛型返回一个匿名类型,但是你不能用推断的泛型来调用它,你需要明确指定它们。
Private Function Copy(Of T)(filePath as String, prototype As T) As T
Return New With { .To = … }
End Function
(适用于.NET的命名约定)
必须按如下方式调用:
Dim nullAction As Action(Of String) = Nothing
Dim proto = New With { .To = nullAction }
Copy(firstFile, proto).To(secondFile)
答案 1 :(得分:1)
对不起这是我能想到的最好的。它不符合您的要求....但它确实为您提供了所需的语法。
Sub Main()
copy("myFile").To("myOtherFile")
End Sub
Private Function copy(ByVal FilePath As String) As String
Return FilePath
End Function
<Extension()> _
Public Sub [To](ByVal FromFile As String, ByVal ToFile As String)
' Code to really copy goes here
my_real_copy_method(FromFile, ToFile)
End Sub
答案 2 :(得分:0)