尽管该类型存在并已加载,但仍无法按全名获取类型

本文关键字:全名 取类型 获取 类型 存在 加载 | 更新日期: 2023-09-27 18:17:00

奇怪的问题,我得到系统。typeloadeexception "Could not load type 'Color ":

using UnityEngine;
Type.GetType(typeof(Color).FullName, true);

当然,我不能只使用typeof(Color),代码表明该类型存在并已加载,其名称是正确的。

typeof(Color).FullName == "UnityEngine.Color"。

我也试过:

typeof(Color).Module.GetTypes().First(t => t.Name == "Color")

可以,但是

typeof(Color).Module.GetType("Color", true, false)

抛出TypeLoadException。所以我得出结论,这不是一个"完全限定名称"的问题,而是别的问题。

我还尝试了UnityEngine组装和另一个第三方组装的另一种类型。

我检查了Mono源代码,但相关代码是C实现的,很难快速理解。

尽管该类型存在并已加载,但仍无法按全名获取类型

Type.FullName不包括程序集-所以除非类型在调用程序集或mscorlib中,否则它将无法找到。

基本上,如果您试图从任意程序集中加载类型,有两个简单的选项:
  • Type.GetType()
  • 中使用程序集限定名
  • 使用Assembly.GetType

如果在编译时知道同一程序集中的另一种类型,通常最简单的方法是:

Type type = typeof(KnownType).Assembly.GetType("Qualified.UnknownType");