众所周知,尽管我试图在实际解决方案中使用该概念,但该问题大部分是学术性的。我意识到这个例子是人为的,但是我相信这个概念是正确的。

我想写一些像这样的流利代码:

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方法:


从方法返回的匿名类型
没有其他的类或接口
最好,我不想将另一个参数传递给告诉要返回哪种类型的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)

10-06 05:14
查看更多