Vb.net 如何在变量声明中将类型类用作类型

Vb.net 如何在变量声明中将类型类用作类型,vb.net,Vb.net,我想对特定类型的控件的不同列表进行相同的操作。我可以一次做一种,但我想:“有很多这样的东西,为什么不做一个循环呢?”现在我当然想知道我哪里做错了。问题很容易重现: Dim myType As Type = GetType(TextBox) Dim newList As New List(Of myType) ' this is not allowed 这是特定的错误消息:BC30002:未定义类型“currentType” 有没有一种方法可以使用类型类的对象作为类型,或者执行类似的操作,让我

我想对特定类型的控件的不同列表进行相同的操作。我可以一次做一种,但我想:“有很多这样的东西,为什么不做一个循环呢?”现在我当然想知道我哪里做错了。问题很容易重现:

Dim myType As Type = GetType(TextBox)
Dim newList As New List(Of myType) ' this is not allowed
这是特定的错误消息:BC30002:未定义类型“currentType”

有没有一种方法可以使用类型类的对象作为类型,或者执行类似的操作,让我可以执行以下操作:

For Each currentType As Type In {GetType(myCustomType), GetType(anotherCustomClassType)}
    Dim newList As New List(Of currentType)
    ' do stuff
Next

不,没有。创建通用
列表时,必须指定数据类型。
类型
对象不是数据类型。它是一个包含数据类型信息的对象。基本上,当您创建一个
列表(T)
时,您只能将
T
修复为您本来可以传递给
GetType
的内容。两者都需要数据类型

不能将数据类型放入列表中,因为它们不是对象。您可以做的是编写一个泛型方法,该方法对一种类型执行您想要的操作,例如

T的私有子DoStuff()
将新列表调整为新列表(共T个)
“在这里做事。
端接头
然后调用该方法并指定不同的泛型类型,例如

(某种类型的)多斯塔夫 (其他类型的)多斯塔夫 等等。

但是,您必须进行单独的调用,因为您需要指定泛型类型。

您可以在运行时使用变量中包含的类型参数实例化泛型类型。但是,除非通过非泛型接口(或在某种公共基础上参数化的变量接口),否则引用它们仍然会有问题。我只是在工厂设置中验证从程序集读取的类型是否具有特定的泛型基础(通常在自身上进行参数化,就像CRTP一样)时才这样做的。如果您有兴趣了解更多信息,请查阅
Type.MakeGenericType
@Craig It's interest。不过,我不认为我可以在声明中使用它。还是很有趣。