一个例子:
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动态创建通用对象。有没有办法做到这一点?
谢谢, 萨姆。
答案 0 :(得分:0)
答案 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
,但不能投放到IEnumerable
或IList
,因为语言根本无法提供给您表示IEnumerable(Of …)
部分(“List(Of …)
具有的相同类型”)所需的表示。
替代方案和更简单的解决方案:您知道,在编译时,…
具有哪种类型(myFoo
,即myFoo
数组,只需将FooClass()
声明为FooClass
即可。