2009-09-17 115 views
1

我有這樣一些代碼:如何創建'OF'變量的類型?

Lookup(Of String)("Testing") 
Lookup(Of Integer)("Testing") 

而且這兩個的查找工作帶來極大。我想要的是根據另一個變量的類型調用適當的LookUp。東西會看起來像......

Lookup(Of GetType(MyStringVariable))("Testing") 

我試圖谷歌這一點,但我有一個很難想出一個合適的搜索。誰能告訴我怎麼做我想要的?

+0

請給出你如何使用這些'Lookup's爲例 – 2009-09-17 20:11:54

+0

_variable_的類型,或此變量當前擁有的_value_的類型?即在Dim x As Object = 123'的情況下,你想要'Object'還是'Integer'? – 2009-09-17 20:22:18

+0

它實際上用於在應用程序中打開不同類型的表單。 '當前'形式是一種特殊的類型,我想用當前表單的類型來調用這個查找。 有一個醜陋的case語句說'如果當前表單是X然後Lookup(Of X)(「Some Stuff」),如果當前表單是Y然後是Lookup(Of Y)'。 我只想說'查找(無論什麼類型的當前形式)',但我不知道如何。 – 2009-09-17 20:23:36

回答

3

你沒有指定你正在調用該方法的完整簽名,但我的精神力量告訴我,這是這樣的:

Function Lookup(Of T)(key As String) As T 

而且要避免重複Integer兩倍於下面的例子:

Dim x As Integer 
x = Lookup(Of Integer)("foo"); 

的問題是,當他們在參數方面正在使用,但從來沒有在返回值的背景下,類型參數只能推斷。所以,你需要用ByRef參數的輔助功能,這樣的伎倆:

Sub Lookup(Of T)(key As String, ByRef result As T) 
    T = Lookup(Of T)(key) 
End Sub 

有了這一點,你可以這樣寫:

Dim x As Integer 
Lookup("foo", x); 
+0

如果他們能夠得到幫助,我並不是ByRef論證的粉絲(雖然他們可能有時需要)。但聰明的方法+1。 :) – eidylon 2009-09-17 20:48:16

+0

這非常酷。而且我非常想找的東西。 作爲跟進;如果我真的想明白這裏發生了什麼,我會搜索/閱讀什麼?這將是'泛型'而不是'反思',對嗎? – 2009-09-17 20:50:14

+0

是的,你想要泛型,通用的方法是準確的。如果您希望只依賴只在運行時知道的類型,而不是在編譯時(例如變量具有的實際值的類型),則只需要參與反射。具體而言,請參閱http://msdn.microsoft.com/en-us/library/w256ka79.aspx和http://msdn.microsoft.com/en-us/library/ms235246.aspx – 2009-09-17 20:56:12

1

對此的一個解決方案是使用反射。詳情請看question

1

VS2008中的VB.NET編譯器實際上使用了類型推斷。這意味着如果您使用的是泛型方法,並且其中一個參數屬於泛型類型,那麼您不需要在調用中指定泛型類型。

採取以下定義...

Function DoSomething(Of T)(Target As T) As Boolean 

如果你有一個強類型的字符串稱它爲目標,並且不指定泛型參數,它會推斷牛逼作爲字符串。
如果您使用強類型整數對目標進行調用,並且未指定通用參數,則會推斷爲T爲整數。

所以,你可以如下調用此函數:

Dim myResult As Boolean = DoSomething("my new string") 

,它會自動推斷的T型爲String。

編輯:
注:這適用於單個或多個通用參數。
注意:這也適用於參數列表中的變量,而不僅僅是文字。

+0

查找(GetType(MyVariable))給了我一個'關鍵字不會命名類型'的錯誤。我會仔細觀察一下,看看我是否能找到我做錯了什麼。 – 2009-09-17 20:29:53

+0

是的,GetType必須用於實際的類型名稱,例如等。但這裏的要點是您不需要指定類型。只需將你的變量傳遞給函數,並在函數調用中省略泛型參數。我正在假設你的函數被定義爲Function Lookup(Of T)(argument As T)。 – eidylon 2009-09-17 20:35:23

+0

我懷疑在他的情況下'T'不是參數類型,而是結果類型。 – 2009-09-17 20:38:55

1

除非進行運行時編譯,否則不能使用動態類型,這當然是非常低效的。

儘管泛型允許您使用不同的類型,但編譯時仍需知道類型,以便編譯器可以爲該類型生成特定的代碼。

這不是要走的路。你應該問問你想要解決什麼問題,而不是問你認爲應該如何解決的方式。即使有可能做出接近你所問的事情,最有可能的是最好的解決方案是完全不同的。