即使类存在,Type.GetType也会失败

时间:2015-05-27 20:53:03

标签: vb.net system.reflection

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

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

这会返回Nothing。这很奇怪,因为同一个文件/命名空间/中的下一部分代码都是......

Public Class DtaRow...

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

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

不,那也没什么。然后,我按照我在这里找到的关于在程序集上循环的一些说明来查看所有这些......在那里也没有运气。所以我尝试寻找“Int32”和其他一些人,phail。

有人可以告诉我,我在这里做错了吗?

1 个答案:

答案 0 :(得分:2)

由于单个Assembly可以有多个Namespaces且同一个名称​​可以存在于多个NameSpace中,因此您必须使用命名空间。来自MSDN

  

如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。

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

NameSpace是Type类型的组成部分,NET的功能大致相同:

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

如果代码位于同一名称空间中的表单或类中,Me.GetType.Namespace将为您提供可以预先添加的字符串名称;或者你可以使用虚拟课程。但是,提及在/中使用代码作为扩展名可能会造成问题。第一个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")