【问题标题】:Cannot get type by full name despite this type exists and is loaded尽管存在此类型并已加载,但无法按全名获取类型
【发布时间】:2014-08-08 10:07:31
【问题描述】:

奇怪的问题,我得到 System.TypeLoadException "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 程序集和另一个第 3 方程序集的其他类型。

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

【问题讨论】:

  • 你能声明一个Color类型的变量吗,即。放下反射,你还能用类型吗?

标签: c# reflection mono unity3d


【解决方案1】:

Type.FullName 不包括程序集 - 因此除非类型在调用程序集或 mscorlib 中,否则将找不到。

基本上,如果您尝试从任意程序集中加载类型,则有两个简单的选项:

  • Type.GetType() 中使用程序集限定名称
  • 使用Assembly.GetType

如果您在编译时知道同一程序集中的另一种类型,通常使用起来最简单:

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

【讨论】:

  • 嗯,组装方式有效,我很惊讶。为什么它与我使用 Module.GetType 尝试的不同?
  • @AndyT:你没有传入命名空间限定名称 - 尝试使用 typeof(Color).Module.GetType(typeof(Color).FullName, true, false),它应该可以工作。
  • 我仍然有点惊讶为什么我应该将完全限定名称传递给 module 类型解析,它已经是一种本地命名空间,不是吗?
  • @AndyT:不,命名空间与模块和程序集完全正交。您可以拥有一个包含多个命名空间中的类型的模块。
猜你喜欢
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 2020-05-21
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多