我有一些代码:
Lookup(Of String)("Testing")
Lookup(Of Integer)("Testing")
这两个Lookup都很棒。我正在尝试根据另一个变量的类型调用相应的LookUp。看起来像......的东西......
Lookup(Of GetType(MyStringVariable))("Testing")
我已经尝试了谷歌,但我很难想出适当的搜索。谁能告诉我如何做我想做的事?
答案 0 :(得分:4)
你没有为你正在调用的方法指定完整的签名,但是我的通灵能力告诉我它是这样的:
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);
答案 1 :(得分:1)
对此的一个解决方案是使用反射。有关详细信息,请参阅此question。
答案 2 :(得分:1)
VS2008中的VB.NET编译器实际上使用了类型推断。这意味着如果您使用的是泛型方法,并且其中一个参数属于泛型类型,那么您无需在调用中指定泛型类型。
采取以下定义......
Function DoSomething(Of T)(Target As T) As Boolean
如果使用目标的强类型字符串调用它,并且未指定泛型参数,则会将 T 推断为字符串。
如果您使用目标的强类型整数调用它,并且未指定泛型参数,则会将 T 推断为整数。
所以你可以按如下方式调用这个函数:
Dim myResult As Boolean = DoSomething("my new string")
它会自动将 T 的类型推断为String。
修改强>
注意:这适用于单个或多个通用参数
注意:这也适用于参数列表中的变量,而不仅仅是文字。
答案 3 :(得分:1)
除非你进行运行时编译,否则你不能使用动态类型,这当然是非常低效的。
尽管泛型允许您使用不同的类型,但仍必须在编译时知道该类型,以便编译器可以为该类型生成特定代码。
这不是要走的路。您应该询问您要解决的问题,而不是询问您认为应该解决的方式。即使有可能做出接近你要求的事情,最有可能的是最好的解决方案是完全不同的。