问题
笔者在编辑器开发过程中遇到一个问题,笔者想通过一个类的名字获取对应的类的Type然后再做一系列的操作,但是笔者发现无法直接获取,于是笔者通过不断的尝试通过下面的方法获取到了,如果有更好的方法欢迎告诉笔者。
解决
话不多说,先上代码:
[MenuItem("Assets/GetType",false,81)]
public static void GetClassTypeByClassTypeName()
{
const string className = "TestScripts";
//方法一(在同一程序集内并且非自身Class才能获取到)
var type = Type.GetType(className);
Debug.LogError(type);
var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
//方法二(有特殊情况会获取不到,笔者没找到获取不到的原因)
type = allAssemblies.Select(assembly => assembly.GetType(className)).FirstOrDefault(assembly => assembly != null);
Debug.LogError(type);
//方法三(如果存在类重名的情况有概率获取错误,可以通过路径做限制)
type = allAssemblies.SelectMany(assembly => assembly.GetTypes()).FirstOrDefault(type1 => type1.Name == className);
Debug.LogError(type);
}
运行结果如下
方法一和方法二的获取条件都有限制,因此笔者建议使用方法三进行获取。
获取方式讲解
方法一是直接在当前程序集进行获取的。
方法二是通过遍历当前程序的所有程序集,然后通过程序集直接GetType进行获取
方法三是类似于方法二,得到所有的程序集再遍历程序集中的Type,判断名字是否相同来得到对应的Type