Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 即使类存在,Type.GetType也会失败_Vb.net_System.reflection - Fatal编程技术网

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

Vb.net 即使类存在,Type.GetType也会失败,vb.net,system.reflection,Vb.net,System.reflection,我有一个文本文件,每行包含不同类型的数据。我试图读取该文件,并为每个文件创建一个不同的(子)类实例。所以我做了 Dim t As Type = Type.GetType("DtaRow") 而这个什么也没有回报。这很奇怪,因为同一文件/名称空间/所有内容中的下一位代码是 Public Class DtaRow... 事实上,我以前输入的代码称之为新方法,没有问题。所以也许我需要这样做 System.Reflection.Assembly.GetExecutingAssembly().GetT

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

Dim t As Type = Type.GetType("DtaRow")
而这个什么也没有回报。这很奇怪,因为同一文件/名称空间/所有内容中的下一位代码是

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

System.Reflection.Assembly.GetExecutingAssembly().GetType("DtaRow")
不,那也没什么。然后我按照我在这里找到的一些关于在程序集上循环的说明来查看所有的程序集。。。那里也没有运气。然后我试着寻找“Int32”和其他一些,phail


有人能告诉我这里有什么明显的错误吗?

由于单个
程序集可以有多个
名称空间
,并且同一名称的类型可以存在于多个名称空间中,因此必须使用名称空间限定类型名称。发件人:

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

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

Dim a As New Animal
myT = a.GetType()
Console.WriteLine(myT.ToString())
' => MyApplication1.Animal
如果代码位于同一命名空间中的某个窗体或类中,
Me.GetType.namespace
将为您获取可以前置的字符串名称;或者可以使用虚拟类。但是,提到在/中使用代码作为扩展可能会使这一点产生问题。首先,
Me
将不合法,使用虚拟类型将报告虚拟对象的
命名空间

如果只有一个名称空间要处理,只需使用一个变量并设置一次:

Friend myNameSpace As String
  ...
' elsewhere something like a MainForm sets it:
myNameSpace - Me.GetType().NameSpace & "."
然后,只需在加载的类型名称前加上前缀

对于多个涉及的名称空间,我将使用
字典(字符串,字符串)
,使用类型名称作为键,使用名称空间限定字符串作为值:

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

从MSDN:
如果类型在当前正在执行的程序集中或Mscorlib.dll中,则提供由其命名空间限定的类型名就足够了。
so
type.GetType(“MyNameSpace.DtaRow”)
应该可以工作。第二个方法也是如此:
name参数包括名称空间,但不包括程序集是否有一种方法可以通过编程方式查找/迭代命名空间?这些类被设计成以类似扩展的方式跨越空间,这个方法在基类中,可以从任何数量的其他地方调用,但需要返回这些空间中的类。我不太明白,但要找到当前名称空间:
Me.GetType.namespace
,用于类或表单。或者使用一个空的
NameSpaceFinder
类,创建一个类并用它代替
Me
。现在您可以将其前置到文本名称。这有一些限制,所以我可能会创建一个类到名称空间的字典;这应该比反思更快找到东西。如果你想进一步阅读的话,是不是引用了指向MSDN页面@puroponix的链接。啊哈,@puroponix,这就是我错过的窍门。回想起来,为什么API不能自动完成这项工作有点神秘,但这就是生活。
myTypeName.Add("DtaRow", "FooNameSpace.DtaRow")
myTypeName.Add("Animal", "CircusActs.Animal")