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!
}
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()应该知道你在谈论哪个?-这就是为什么你必须传入一个完全限定的字符串-这样它就确切地知道在哪里查找和查找什么。