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")
我有一个文本文件,每行包含不同类型的数据。我正在尝试读取文件并为每个文件创建一个不同的 (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")