众所周知,这个问题主要是学术问题,尽管我试图在现实世界的解决方案中使用这个概念.我意识到这个例子是人为的,但我相信这个概念是有效的. 我想写一些像这样流畅的代码: copy(my_
我想写一些像这样流畅的代码:
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方法:
>从Method返回的匿名类型
>没有其他类或接口
>最好,我不想将另一个参数传递给copy()方法,该方法告诉返回什么类型,除非copy变成泛型方法(但我认为这意味着定义另一个类/接口,我不想这样做)做)
我知道这听起来很苛刻,如果我遇到困难,可以随叫“公牛”!
提前致谢.
由于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)