2009-04-08 45 views
4

這是兩個問題(比另一個更具體)。我可以限定VB.NET中的參數類型嗎?

如果我有這樣的方法:

Public Function Blah(String Foo) 
End Function 

我可以出線美孚對另一種類型(例如我可以要求富是一個字符串,也實現了IInterface?)。

我想象隱約類似於此:

Public Function Blah(RandomObject Foo Where RandomObject Is IInterface) 
End Function 

另外,有沒有什麼辦法來限定類型參數?

例如,我可以要求Type I作爲參數採用特定的類樹嗎?

Public Function Blah(Type t Where Type Of String) 
End Function 

我要指出,我在屬性的屬性的情況下使用此所以類聲明本身不能通用(這純粹是集中在排位賽的方法參數,而不是鍵入類及其方法)。

回答

3

這看起來像泛型對我來說的情況。你的方法簽名會是這樣在VB.NET:

Public Function Blah(Of T As {IImplementedByT})(Foo As T) 

這指定富可以是任何類型T,只要爲T實現IImplementedByT。請注意,如果不包含需要通用的類,此方法可以是通用的。如果你想噸至從RandomClass派生的類也實現了該接口,您可以指定兩個約束:

Public Function Blah(Of T As {RandomClass, IImplementedByT})(Foo As T) 
+0

謝謝 - 這很有趣也很實用,但我發現我想做的事情是別的。我試圖將這應用於屬性,但不能在set子句中使用類型參數。 – 2009-04-08 07:01:43

0

不確定你的意思是「Foo是一個也實現IInterface的字符串」。

字符串類是密封的,所以你不能從它繼承&因此你不能在它上面實現一個接口。

我希望我在正確的頁面上。

+0

好吧字符串是一個不好的例子,假設一個非密封類即可。 – 2009-04-08 06:41:52

1

您可以對通用類型執行第一個操作,但不適用於非通用類型。基本上一個變量(包括一個參數)只能有一個編譯時類型,所以你不能說「它必須是FooIBar--你必須選擇一個或另一個。泛型讓你說」它有是某種類型的T其中TFoo派生並實現IBar「雖然

泛型是一個很大的話題 - 太大堆​​棧溢出的答案覆蓋 - 但微軟有一個good introductory article

至於你的第二個問題 - 不,你不能這樣做,Type的值只會在執行時知道,所以它必須是執行時間檢查。但是,有一種情況,用Type.IsAssignableFrom

+0

謝謝 - 我認爲我很瞭解泛型,但似乎無法獲得VB.NET語法對合格方法的正確判斷,除非我也限定了該類。至於類型檢查,我想這是編譯器可以處理的一件事,但你是對的,我沒有考慮動態類型。 – 2009-04-08 06:56:22

相關問題