C#类型的反映:GetType(“myType”)与typeof(myType)行为不同。为什么?

时间:2013-05-30 14:39:00

标签: c# reflection typeof

我想使用反射来获取提供的命名空间和类型的程序集。我更愿意将它们作为字符串提供。值得注意的是,命名空间和类型在程序集 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!
   }

感谢您提供任何见解......

2 个答案:

答案 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()知道你正在谈论哪一个? - 这就是为什么你必须传入一个完全限定的字符串 - 所以它确切地知道在哪里寻找和寻找什么。