我对VB.Net有疑问。我通常使用CSharp。
Type.FullName属性似乎包含程序集的名称,但文档说它不应该:
... Type的完全限定名称,包括Type的名称空间,但不包括程序集;
''Class1.vb -- compiled into assembly VBLib
Namespace Space1
Public Class Class1
End Class
End Namespace
''Class2.cs
namespace Space2
{
class Class2
{
}
}
''Program.cs
using Space2;
using VBLib.Space1; // Need to prefix the namespace with the assembly name?
static void Main(string[] args)
{
Type t1 = typeof(Class1);
Type t2 = typeof(Class2);
Console.WriteLine("t1 = " + t1.FullName);
Console.WriteLine("t2 = " + t2.FullName);
}
输出:
t1 = VBLib.Space1.Class1
t2 = Space2.Class2
我正在使用反射并尝试在CSharp和VB完整类型名称之间获得一些一致的行为。
答案 0 :(得分:1)
在C#中,您指定完整的命名空间,包括文件中项目的默认命名空间。通常,项目的默认命名空间是文件中指定的命名空间的第一部分,但您也可以指定独立于项目默认命名空间的命名空间。
相反,在VB.NET项目中,您在文件中指定的命名空间放在项目的默认命名空间之后。因此,如果将名称空间Space1
放入文件中,则如果项目的默认名称空间为VBLib.Space1
,则类型位于VBLib
。
由于项目的默认命名空间通常与程序集名称相同,因此似乎VB.NET将程序集名称放在命名空间的前面。要对此进行测试,可以更改项目的默认命名空间,使其与程序集名称不同。
这两种方法各有利弊。 C#一方面更灵活,但如果要更改默认命名空间,则必须更改所有文件。在VB.NET中,更改默认命名空间很简单,但是在选择命名空间时灵活性较低,因为默认命名空间始终是第一部分。