【问题标题】:Defining the type of a List in vb.net at runtime在运行时在 vb.net 中定义列表的类型
【发布时间】:2014-07-10 12:36:11
【问题描述】:

我正在使用typebuilder 在运行时创建一个类,在我创建这个类之后,我想为一个列表定义它的类型

dim fooList as new List(of DynamicClassName)

由于这在编译时不存在,所以它当然会引发错误。当我生成这种类型时,我会返回类型,所以我不能做类似的事情

dim newType = createNewType(foobar)
dim fooList as new List(of getType(newType))

如何在运行时分配 List 的类型?

【问题讨论】:

  • 我还没有使用TypeBuilder 完成此操作,但是使用CodeDOM 您可以拥有一个几乎空的MustInherit 类,动态类型从该类继承,然后将新对象添加到List(Of baseclassType)。否则,我想你只剩下List(Of Object)
  • 看到这个:stackoverflow.com/q/9053440/1070452 看起来它通常解决了同样的问题,可能有两种方式( 和基类方法)。看起来 TypeBuilder 比 CodeDOM、FWIW 更复杂和令人费解
  • 实际上,我发现 FWIW IMO the difference between CodeDOM and TypeBuilder 相当可观。 CodeDOM 可以生成更多语言的代码,但 TypeBuilder 更强大。

标签: vb.net


【解决方案1】:

您可以创建一个List(Of T),但 AFAIK 您将无法将其转换为类型化对象。我在下面的例子中使用了String 类型。

Dim list As Object = Activator.CreateInstance(GetType(List(Of )).MakeGenericType(New Type() {GetType(String)}))

Debug.WriteLine((TypeOf list Is List(Of String)).ToString())

输出

是的

所以在你的情况下它看起来像这样:

Dim newType = createNewType(foobar)

'Creates a List(Of foobar):
Dim list As IList = Ctype(Activator.CreateInstance(GetType(List(Of )).MakeGenericType(New Type() {newType})), IList)

'Creates a BindingList(Of foobar):
Dim bindingList As IBindingList = Ctype(Activator.CreateInstance(GetType(BindingList(Of )).MakeGenericType(New Type() {newType})), IBindingList)

【讨论】:

  • 我认为这个代码会很长而且有点难看,但是在处理了 TypeBuilder 之后我就很好了。
  • 哈哈,我知道了!使用反射命名空间时,您最终会得到很多代码。
  • 幸运的是,他们的示例非常适合重复使用!好开心。
  • 遗憾的是,当您添加到 bindingList 时,您会得到“值“MyRunTimeClassName”不是“System.RuntimeType”类型,不能在此通用集合中使用。”我做 'dim newObject = Activator.createinstance(newtype)' 并在调用属性后在 'bindingList.add(newObject)' 上中断。
  • 您确定您使用的类型正确吗?如果newType Type,则将newType.GetType() 替换为newType
【解决方案2】:

这并不能回答您的问题,但可能会解决您的问题。

另一种选择是使用 ArrayList(您不必为其分配类型)。您可以在此处查看详细信息:http://msdn.microsoft.com/en-us/library/system.collections.arraylist(v=vs.110).aspx

这是一个基本的例子:

Dim anyArrayList as new ArrayList()
anyArrayList.add("Hello")
anyArrayList.add("Testing")

【讨论】:

  • 这确实解决了我最初的困境,但提出了"How do I data bind an ArrayList to a ListBox" 的下一个问题。该问题的唯一明显答案是“您应该使用 BindingList”,这让我回到了我的问题。
  • @user2567273 不,这不是问题。我更新了我的问题,包括如何在运行时创建 BindingList<T>
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多