Vb.net 我如何创造一些东西';属于';变量';s型?

Vb.net 我如何创造一些东西';属于';变量';s型?,vb.net,types,Vb.net,Types,我有一些代码,比如: Lookup(Of String)("Testing") Lookup(Of Integer)("Testing") 这两种查找都非常有效。我试图根据另一个变量的类型调用适当的查找。看起来像 Lookup(Of GetType(MyStringVariable))("Testing") 我试着用谷歌搜索这个,但我很难找到合适的搜索。有人能告诉我怎么做我想做的吗?解决这个问题的一个方法是使用反射。有关详细信息,请参见此部分。VS2008中的VB.NET编译器实际上使用类型

我有一些代码,比如:

Lookup(Of String)("Testing")
Lookup(Of Integer)("Testing")
这两种查找都非常有效。我试图根据另一个变量的类型调用适当的查找。看起来像

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

我试着用谷歌搜索这个,但我很难找到合适的搜索。有人能告诉我怎么做我想做的吗?

解决这个问题的一个方法是使用反射。有关详细信息,请参见此部分。

VS2008中的VB.NET编译器实际上使用类型推断。这意味着如果您使用的是泛型方法,并且其中一个参数是泛型类型的,那么您不需要在调用中指定泛型类型

以下面的定义为例

Function DoSomething(Of T)(Target As T) As Boolean 
如果您使用强类型字符串调用它作为Target,并且没有指定泛型参数,它将推断t为字符串。
如果为目标使用强类型整数调用它,并且没有指定泛型参数,它将推断t为整数

因此,您可以按如下方式调用此函数:

Dim myResult As Boolean = DoSomething("my new string")
它将自动推断T的类型为字符串

编辑:
注意:这适用于单个或多个通用参数。

注意:这也适用于参数列表中的变量,而不仅仅是文字。

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

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


这不是我们要走的路。你应该问你想解决什么问题,而不是问你认为应该如何解决。即使有可能做一些接近你要求的事情,但最好的解决方案很可能是完全不同的事情。

你没有指定你调用的方法的完整签名,但我的灵力告诉我这是:

Function Lookup(Of T)(key As String) As T
您希望避免重复
Integer
两次,如下例所示:

Dim x As Integer
x = Lookup(Of Integer)("foo");
问题是,类型参数仅在参数上下文中使用时才被推导,而不会在返回值上下文中使用。因此,您需要一个带有
ByRef
参数的helper函数来执行以下操作:

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);

请举例说明如何使用变量的
Lookup
sType或该变量当前持有的值类型?例如,如果
Dim x As Object=123
,您想要
Object
还是
Integer
?它实际上用于在应用程序中打开不同类型的表单。“当前”表单是一种特殊类型,我想用当前表单的类型调用此查找。有一个丑陋的案例陈述说,‘如果当前形式是X,那么查找(X的)(“一些东西”),如果当前形式是Y,那么查找(Y的)’。我只想说“查找(当前表单的任何类型)”,但我不知道如何操作。“如果Dim x为Object=123,您需要Object还是Integer?”-我需要“Object”。虽然,在我的特殊情况下,我会使用'Dim x as Integer=123',因此我认为在这两种情况下都会得到相同的结果,但我只是猜测。查找(GetType(MyVariable))会给我一个错误,即'Keyword不命名类型。'我会仔细查看,看看是否可以找到我做错的地方。是的,GetType必须用于实际的类型名,例如,等等,但这里的要点是您不需要指定类型。只需将变量传递到函数中,并在函数调用中省略泛型参数。我假设你的函数被定义为函数查找(Of T)(参数为T)。我怀疑在他的例子中,
T
不是参数类型,而是结果类型。Rob,你能更新你的OP并包含查找函数的定义吗,所以我们可以更好地理解?如果ByRef的论点能得到帮助的话(尽管有时可能需要),我不喜欢这些论点。但聪明的方法是+1.:)那很酷。这正是我想要的。作为后续行动;如果我真的想了解这里发生了什么,我会搜索/阅读什么?这将是“泛型”而不是“反射”,对吗?是的,你希望泛型,泛型方法是精确的。只有当您希望反射依赖于仅在运行时而不是编译时已知的类型(例如变量的实际值类型)时,才需要涉及反射。具体而言,请参见和