2011-03-03 52 views
4

就這樣知道,這個問題主要是學術,儘管我試圖在現實世界的解決方案中使用這個概念。我意識到這個例子是人爲的,但我相信這個概念是有效的。從函數返回一個(具有函數的匿名類型) - 有沒有更好的方法?

我想寫一些流利這樣的代碼:

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) 

所以沒有智能感知或認知型那裏,我必須包括調用,以便有方法運行。我怎樣才能得到更多的類型安全和排除Invoke方法,在這些限制下:

  • 匿名類型的方法返回
  • 沒有額外的類或接口
  • 優選的是,我不希望在其他參數來傳遞複製()方法,告訴什麼類型返回,除非複製成爲一種通用的方法(但我認爲這意味着定義另一個類/接口,我不想這樣做)

我知道聲音相當苛刻,如果我有點困難,隨時可以打電話給「Bull」邪教!

在此先感謝。

+0

@加貝號請參閱我的回答。 – 2011-03-03 17:44:40

回答

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) 
+0

是的,這正是我想要避免的,但我明白你在說什麼。我看到Chris Eargle(kodefuguru)做了類似的事情,比如: 'copy(Of T)(my_first_file,ReturnFunction As Func(Of Action(Of String),T))T' 但我想避免這種情況。很好的解釋,我會投票。在回答問題之前,我會給你一些時間。 – grefly 2011-03-03 17:51:22

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 
+0

謝謝!我看到語法看起來不錯,我只是想盡可能匿名。 – grefly 2011-03-03 17:56:42

0

我知道你說過你的例子很有意思,但這個怎麼樣?它支持方法鏈接(CopyToreturns a FileInfo),即使它不是fluent。它也被編入System.IO

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