我有這樣一些代碼:如何創建'OF'變量的類型?
Lookup(Of String)("Testing")
Lookup(Of Integer)("Testing")
而且這兩個的查找工作帶來極大。我想要的是根據另一個變量的類型調用適當的LookUp。東西會看起來像......
Lookup(Of GetType(MyStringVariable))("Testing")
我試圖谷歌這一點,但我有一個很難想出一個合適的搜索。誰能告訴我怎麼做我想要的?
我有這樣一些代碼:如何創建'OF'變量的類型?
Lookup(Of String)("Testing")
Lookup(Of Integer)("Testing")
而且這兩個的查找工作帶來極大。我想要的是根據另一個變量的類型調用適當的LookUp。東西會看起來像......
Lookup(Of GetType(MyStringVariable))("Testing")
我試圖谷歌這一點,但我有一個很難想出一個合適的搜索。誰能告訴我怎麼做我想要的?
你沒有指定你正在調用該方法的完整簽名,但我的精神力量告訴我,這是這樣的:
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);
如果他們能夠得到幫助,我並不是ByRef論證的粉絲(雖然他們可能有時需要)。但聰明的方法+1。 :) – eidylon 2009-09-17 20:48:16
這非常酷。而且我非常想找的東西。 作爲跟進;如果我真的想明白這裏發生了什麼,我會搜索/閱讀什麼?這將是'泛型'而不是'反思',對嗎? – 2009-09-17 20:50:14
是的,你想要泛型,通用的方法是準確的。如果您希望只依賴只在運行時知道的類型,而不是在編譯時(例如變量具有的實際值的類型),則只需要參與反射。具體而言,請參閱http://msdn.microsoft.com/en-us/library/w256ka79.aspx和http://msdn.microsoft.com/en-us/library/ms235246.aspx – 2009-09-17 20:56:12
對此的一個解決方案是使用反射。詳情請看question。
VS2008中的VB.NET編譯器實際上使用了類型推斷。這意味着如果您使用的是泛型方法,並且其中一個參數屬於泛型類型,那麼您不需要在調用中指定泛型類型。
採取以下定義...
Function DoSomething(Of T)(Target As T) As Boolean
如果你有一個強類型的字符串稱它爲目標,並且不指定泛型參數,它會推斷牛逼作爲字符串。
如果您使用強類型整數對目標進行調用,並且未指定通用參數,則會推斷爲T爲整數。
所以,你可以如下調用此函數:
Dim myResult As Boolean = DoSomething("my new string")
,它會自動推斷的T型爲String。
編輯:
注:這適用於單個或多個通用參數。
注意:這也適用於參數列表中的變量,而不僅僅是文字。
查找(GetType(MyVariable))給了我一個'關鍵字不會命名類型'的錯誤。我會仔細觀察一下,看看我是否能找到我做錯了什麼。 – 2009-09-17 20:29:53
是的,GetType必須用於實際的類型名稱,例如
我懷疑在他的情況下'T'不是參數類型,而是結果類型。 – 2009-09-17 20:38:55
除非進行運行時編譯,否則不能使用動態類型,這當然是非常低效的。
儘管泛型允許您使用不同的類型,但編譯時仍需知道類型,以便編譯器可以爲該類型生成特定的代碼。
這不是要走的路。你應該問問你想要解決什麼問題,而不是問你認爲應該如何解決的方式。即使有可能做出接近你所問的事情,最有可能的是最好的解決方案是完全不同的。
請給出你如何使用這些'Lookup's爲例 – 2009-09-17 20:11:54
_variable_的類型,或此變量當前擁有的_value_的類型?即在Dim x As Object = 123'的情況下,你想要'Object'還是'Integer'? – 2009-09-17 20:22:18
它實際上用於在應用程序中打開不同類型的表單。 '當前'形式是一種特殊的類型,我想用當前表單的類型來調用這個查找。 有一個醜陋的case語句說'如果當前表單是X然後Lookup(Of X)(「Some Stuff」),如果當前表單是Y然後是Lookup(Of Y)'。 我只想說'查找(無論什麼類型的當前形式)',但我不知道如何。 – 2009-09-17 20:23:36