繁体   English   中英

VB.NET:从对象类型获取“类”

[英]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变量作为存储在db字段中的数据类型

反射(一种运行时工具)和静态类型(一种编译时事件)通常并不能很好地融合在一起,而这只是这种主张的一个例子。 您想要做的几乎可以完成。 让我们来看看另一件事。

让我们从已有的内容开始:

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转换为IEnumerableIList ,但不能IList转换为IEnumerable(Of …)List(Of …)因为该语言根本无法为您提供表达部分( “与myFoo具有的类型相同”)。

替代方案和简单得多的解决方案:由于您知道在编译时myFoo具有什么类型( FooClass() ,即FooClass的数组),只需将listOfFoo声明为List(Of FooClass())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM