c#类型的反射:GetType("myType")vs . typeof(myType)行为不同.为

本文关键字:myType quot 类型 typeof vs 反射 GetType | 更新日期: 2023-09-27 18:16:11

我想使用反射来获取所提供的名称空间和类型的程序集。我更愿意提供这些字符串。可能需要注意的是,名称空间和类型是在与执行该代码的程序集不同的程序集中定义的,但是执行代码程序集确实有对其他程序集的引用

我的问题是为什么静态GetType(string)方法返回null,而如果我硬编码名称空间和类并使用typeof(),如在if语句中,我得到所需的结果?

代码如下:

   string fullClassName = "MyNameSpace.MyClass";
   Type t = Type.GetType( fullClassName  ); // this returns null!
   if ( t == null ) 
   {
      t = typeof(MyNameSpace.MyClass); // this returns a valid type!
   }

c#类型的反射:GetType("myType")vs . typeof(myType)行为不同.为

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"));

阅读这篇c#。NET - Type.GetType("System.Windows.Forms.Form")返回null

Type t = Type.GetType("MyObject"); //null

要求传入一个完全限定的程序集类型字符串(参见上面链接的答案)

Type t = typeof(MyObject); //Type representing MyObject

编译器/运行时已经知道这个类型了,因为你已经直接传入了它。

考虑:

MyObject可能作为不同的东西存在于不同的程序集中,因此,为什么Type.GetType()应该知道你在谈论哪个?-这就是为什么你必须传入一个完全限定的字符串-这样它就确切地知道在哪里查找和查找什么。