Type.GetType 失败,即使 class 存在

Type.GetType fails even though class exists

我有一个文本文件,每行包含不同类型的数据。我正在尝试读取文件并为每个文件创建一个不同的 (sub)class 实例。所以我做了...

Dim t As Type = Type.GetType("DtaRow")

而这个returns没什么。这很奇怪,因为同一个 file/namespace/everything 中的下一段代码是...

Public Class DtaRow...

事实上,我之前输入的代码只是调用它的 New 方法没有问题。所以也许我需要这样做...

System.Reflection.Assembly.GetExecutingAssembly().GetType("DtaRow")

不,那也没什么。因此,然后我按照我在此处找到的一些说明进行操作,这些说明是关于遍历程序集以查看所有程序集的……也没有运气。所以我试着寻找 "Int32" 和其他一些东西,phail.

有人可以告诉我我在这里做错的明显地方吗?

因为一个 Assembly 可以有多个 Namespaces 并且同名的类型 可以 存在于多个命名空间中,你必须符合带有命名空间的类型名称。来自 MSDN

If the type is in the currently executing assembly or in Mscorlib.dll, it is sufficient to supply the type name qualified by its namespace.

' should work
myT = Type.GetType("MyNameSpace.DtaRow")
' similarly:
myT = Type.GetType("System.Int32")

命名空间是类型名称不可或缺的一部分,NET 的作用大致相同:

Dim a As New Animal
myT = a.GetType()
Console.WriteLine(myT.ToString())
' => MyApplication1.Animal

如果代码在表单中或 class 在同一个命名空间中,Me.GetType.Namespace 将为您提供可以添加前缀的字符串名称;或者你可以使用虚拟 class。但是,提到使用代码 in/as 扩展可能会产生问题。首先 Me 将不合法,使用虚拟类型将报告虚拟对象的 NameSpace

如果只有一个NameSpace需要处理,就用一个变量,设置一次即可:

Friend myNameSpace As String
  ...
' elsewhere something like a MainForm sets it:
myNameSpace - Me.GetType().NameSpace & "."

然后,只需将其添加到您加载的类型名称前即可。

对于 不止一个涉及的 NameSpace,我会使用一个 Dictionary(Of String, String),使用类型名称作为键,NameSpace 限定字符串作为值:

myTypeName.Add("DtaRow", "FooNameSpace.DtaRow")
myTypeName.Add("Animal", "CircusActs.Animal")