我想使用反射来获取提供的命名空间和类型的程序集。我更愿意将它们作为字符串提供。值得注意的是,命名空间和类型在程序集 other 中定义,而不是执行此代码的程序集,但执行代码程序集确实有引用其他集会。
我的问题是为什么静态GetType(string)方法返回null,而如果我硬编码命名空间和类并使用if语句中的typeof(),我得到所需的结果?
以下是代码:
string fullClassName = "MyNameSpace.MyClass";
Type t = Type.GetType( fullClassName ); // this returns null!
if ( t == null )
{
t = typeof(MyNameSpace.MyClass); // this returns a valid type!
}
感谢您提供任何见解......
答案 0 :(得分:14)
GetType
实际上查询特定程序集(在运行时)以查找可能在程序集中定义的类型(类似于new Object().GetType()
)。另一方面,typeof
是在编译时确定的。
例如:
// Nonsense. "Control" is not in the same assembly as "String"
Console.WriteLine(typeof(String).Assembly.GetType("System.Windows.Controls.Control"));
// This works though because "Control" is in the same assembly as "Window"
Console.WriteLine(typeof(Window).Assembly.GetType("System.Windows.Controls.Control"));
答案 1 :(得分:1)
阅读此C#.NET - Type.GetType("System.Windows.Forms.Form") returns null
Type t = Type.GetType("MyObject"); //null
要求您传入一个完全限定的程序集类型字符串(请参阅上面链接中的答案)
Type t = typeof(MyObject); //Type representing MyObject
编译器/运行时知道已经直接传递它的类型。
<强>代价:强>
MyObject
可能在不同的程序集中作为不同的东西存在,因此,为什么Type.GetType()知道你正在谈论哪一个? - 这就是为什么你必须传入一个完全限定的字符串 - 所以它确切地知道在哪里寻找和寻找什么。