[英]VB.NET: Get “Class” from object type
一个例子:
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动态创建一个通用对象。 有没有办法做到这一点?
谢谢,山姆
反射(一种运行时工具)和静态类型(一种编译时事件)通常并不能很好地融合在一起,而这只是这种主张的一个例子。 您想要做的几乎可以完成。 让我们来看看另一件事。
让我们从已有的内容开始:
Dim fooT As Type = myFoo.GetType()
现在,让我们构建一个Type
对象,该对象代表一个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>)
:
Dim listOfFoo = Activator.CreateInstance(listOfFooT)
请注意,我已经反复使用了无效的VB.NET伪语法( <myFoo's type>
),并且还注意到我没有明确声明listOfFoo
的类型。 两者都是由于以下事实:在VB.NET(也没有C#btw。)中无法表达类型“与myFoo
具有相同类型的List
”。
Activator.CreateInstance
实际上确实创建了这样一个列表(您可以通过listOfFoo.GetType()
检查其动态类型),但是在编译时,您只能将其视为Object
(即,该特定方法的静态声明的返回类型) 。 您可以将返回的对象IEnumerable
转换为IEnumerable
或IList
,但不能IList
转换为IEnumerable(Of …)
或List(Of …)
因为该语言根本无法为您提供表达…
部分( “与myFoo
具有的类型相同”)。
替代方案和简单得多的解决方案:由于您知道在编译时myFoo
具有什么类型( FooClass()
,即FooClass
的数组),只需将listOfFoo
声明为List(Of FooClass())
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.