diff --git a/Il2CppInspector/Il2CppModel.cs b/Il2CppInspector/Il2CppModel.cs index 7cf518e..8d887e1 100644 --- a/Il2CppInspector/Il2CppModel.cs +++ b/Il2CppInspector/Il2CppModel.cs @@ -19,6 +19,9 @@ namespace Il2CppInspector.Reflection // List of all types ordered by their TypeDefinitionIndex public TypeInfo[] TypesByDefinitionIndex { get; } + // List of all type definitions by fully qualified name + public Dictionary TypesByFullName { get; } = new Dictionary(); + // List of all type usages ordered by their type usage index public TypeInfo[] TypesByUsageIndex { get; } @@ -48,9 +51,6 @@ namespace Il2CppInspector.Reflection // Get an assembly by its name public Assembly GetAssembly(string name) => Assemblies.FirstOrDefault(a => a.FullName == name); - // Get a type by its full name - public TypeInfo GetType(string name) => Types.FirstOrDefault(t => t.FullName == name); - private TypeInfo getNewTypeUsage(Il2CppType usage, MemberTypes memberType) { switch (usage.type) { case Il2CppTypeEnum.IL2CPP_TYPE_CLASS: @@ -94,7 +94,7 @@ namespace Il2CppInspector.Reflection return null; var fqn = Il2CppConstants.FullNameTypeString[(int) t]; - return TypesByDefinitionIndex.First(x => x.FullName == fqn); + return TypesByFullName[fqn]; } // Type from a virtual address pointer diff --git a/Il2CppInspector/Reflection/TypeInfo.cs b/Il2CppInspector/Reflection/TypeInfo.cs index cdbe16b..014741b 100644 --- a/Il2CppInspector/Reflection/TypeInfo.cs +++ b/Il2CppInspector/Reflection/TypeInfo.cs @@ -27,8 +27,8 @@ namespace Il2CppInspector.Reflection { public TypeInfo BaseType => IsPointer? null : baseTypeUsage != -1? Assembly.Model.GetTypeFromUsage(baseTypeUsage, MemberTypes.TypeInfo) - : IsArray? Assembly.Model.TypesByDefinitionIndex.First(t => t.FullName == "System.Array") - : Namespace != "System" || BaseName != "Object" ? Assembly.Model.TypesByDefinitionIndex.First(t => t.FullName == "System.Object") + : IsArray? Assembly.Model.TypesByFullName["System.Array"] + : Namespace != "System" || BaseName != "Object" ? Assembly.Model.TypesByFullName["System.Object"] : null; // True if the type contains unresolved generic type parameters @@ -252,6 +252,7 @@ namespace Il2CppInspector.Reflection { // Add to global type definition list Assembly.Model.TypesByDefinitionIndex[Index] = this; + Assembly.Model.TypesByFullName[FullName] = this; if ((Definition.flags & Il2CppConstants.TYPE_ATTRIBUTE_SERIALIZABLE) != 0) Attributes |= TypeAttributes.Serializable;