VB.NET:Get" Class"来自对象类型

时间:2014-10-23 18:33:41

标签: .net vb.net class generics types

一个例子:

Dim myFoo as FooClass()
Dim fooType = myFoo.GetType()

'This is how it's normally done...
Dim myList as List(Of FooClass) = nothing

'I need to basically do something like this
Dim myOtherList as List(Of fooType) = nothing

基本上,我尝试基于Type动态创建通用对象。有没有办法做到这一点?

谢谢,   萨姆。

2 个答案:

答案 0 :(得分:0)

几天前,我碰到了几乎同样的问题。

可以使用反射来解决。

见:

Dim variable as datatype stored in db field

答案 1 :(得分:0)

反射(运行时工具)和静态类型(编译时间事务)通常不能很好地混合,这只是该声明的一个例子。你想做什么可以几乎完成。让我们一个接一个地看待它。

让我们从你已经拥有的东西开始:

Dim fooT As Type = myFoo.GetType()

现在让我们构建一个代表Type的{​​{1}}对象。

List(Of <myFoo's type>)

最后,让我们实例化一个Dim listT As Type = GetType(List(Of )) ' (this is valid syntax, not a typo!) ' Dim listOfFooT As Type = listT.MakeGenericType(fooT)

List(Of <myFoo's type>)

请注意,我已经多次使用了无效的VB.NET(Dim listOfFoo = Activator.CreateInstance(listOfFooT) )的伪语法,并且还注意到我没有明确声明<myFoo's type>的类型。两者都是因为VB.NET(也不是C#btw。)没有办法表达listOfFoo具有相同类型的“List类型。”

myFoo实际上 创建了这样一个列表(您可以通过Activator.CreateInstance检查其动态类型),但在编译时,您只能将其视为{ {1}}(即该特定方法的静态声明的返回类型)。您可以将返回的对象强制转换为listOfFoo.GetType()Object,但不能投放到IEnumerableIList,因为语言根本无法提供给您表示IEnumerable(Of …)部分(“List(Of …)具有的相同类型”)所需的表示。

替代方案和更简单的解决方案:您知道,在编译时,具有哪种类型(myFoo,即myFoo数组,只需将FooClass()声明为FooClass即可。