从函数返回(带函数的匿名类型) - 有更好的方法吗?

时间:2011-03-03 17:24:01

标签: vb.net lambda anonymous-types

就是众所周知,这个问题主要是学术上的,即使我试图在现实世界的解决方案中使用这个概念。我意识到这个例子是人为的,但我相信这个概念是有效的。

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

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成为泛型方法(但我认为这意味着定义另一个类/接口,我不这样做想做)

我知道这听起来非常苛刻,如果我遇到困难,可以随叫“公牛”!

提前致谢。

3 个答案:

答案 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)

我知道你说你的例子是人为的,但这个怎么样?它支持方法链(CopyTo returnsFileInfo),即使它不是fluent。它也内置于System.IO

Dim f As New FileInfo("c:\x.txt")
f.CopyTo("c:\y.txt")