如何创建'变量'类型的东西?

时间:2009-09-17 20:07:13

标签: vb.net types

我有一些代码:

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

这两个Lookup都很棒。我正在尝试根据另一个变量的类型调用相应的LookUp。看起来像......的东西......

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

我已经尝试了谷歌,但我很难想出适当的搜索。谁能告诉我如何做我想做的事?

4 个答案:

答案 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)

除非你进行运行时编译,否则你不能使用动态类型,这当然是非常低效的。

尽管泛型允许您使用不同的类型,但仍必须在编译时知道该类型,以便编译器可以为该类型生成特定代码。

这不是要走的路。您应该询问您要解决的问题,而不是询问您认为应该解决的方式。即使有可能做出接近你要求的事情,最有可能的是最好的解决方案是完全不同的。