示例#1
0
 private void AddFields(Il2CppTypeDefinition typeDef, StructInfo structInfo, Il2CppGenericContext context)
 {
     if (typeDef.field_count > 0)
     {
         var fieldEnd = typeDef.fieldStart + typeDef.field_count;
         for (var i = typeDef.fieldStart; i < fieldEnd; ++i)
         {
             var fieldDef  = metadata.fieldDefs[i];
             var fieldType = il2Cpp.types[fieldDef.typeIndex];
             if ((fieldType.attrs & FIELD_ATTRIBUTE_LITERAL) != 0)
             {
                 continue;
             }
             var structFieldInfo = new StructFieldInfo();
             structFieldInfo.FieldTypeName = ParseType(fieldType, context);
             var fieldName = FixName(metadata.GetStringFromIndex(fieldDef.nameIndex));
             structFieldInfo.FieldName   = fieldName;
             structFieldInfo.IsValueType = IsValueType(fieldType, context);
             if ((fieldType.attrs & FIELD_ATTRIBUTE_STATIC) != 0)
             {
                 structInfo.StaticFields.Add(structFieldInfo);
             }
             else
             {
                 structInfo.Fields.Add(structFieldInfo);
             }
         }
     }
 }
示例#2
0
 private void AddFields(Il2CppTypeDefinition typeDef, List <StructFieldInfo> fields, List <StructFieldInfo> staticFields, Il2CppGenericContext context, bool isParent)
 {
     if (!typeDef.IsValueType && !typeDef.IsEnum)
     {
         if (typeDef.parentIndex >= 0)
         {
             var parent = il2Cpp.types[typeDef.parentIndex];
             ParseParent(parent, out var parentDef, out var parentContext);
             if (parentDef != null)
             {
                 AddFields(parentDef, fields, staticFields, parentContext, true);
             }
         }
     }
     if (typeDef.field_count > 0)
     {
         var fieldEnd = typeDef.fieldStart + typeDef.field_count;
         for (var i = typeDef.fieldStart; i < fieldEnd; ++i)
         {
             var fieldDef  = metadata.fieldDefs[i];
             var fieldType = il2Cpp.types[fieldDef.typeIndex];
             if ((fieldType.attrs & FIELD_ATTRIBUTE_LITERAL) != 0)
             {
                 continue;
             }
             var structFieldInfo = new StructFieldInfo();
             structFieldInfo.FieldTypeName = ParseType(fieldType, context);
             var fieldName = FixName(metadata.GetStringFromIndex(fieldDef.nameIndex));
             structFieldInfo.FieldName   = fieldName;
             structFieldInfo.IsValueType = IsValueType(fieldType, context);
             if ((fieldType.attrs & FIELD_ATTRIBUTE_STATIC) != 0)
             {
                 if (!isParent)
                 {
                     staticFields.Add(structFieldInfo);
                 }
             }
             else
             {
                 if (isParent)
                 {
                     var access = fieldType.attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK;
                     if (access == FIELD_ATTRIBUTE_PRIVATE)
                     {
                         structFieldInfo.FieldName = $"{FixName(metadata.GetStringFromIndex(typeDef.nameIndex))}_{fieldName}";
                     }
                 }
                 if (fields.Any(x => x.FieldName == structFieldInfo.FieldName))
                 {
                     structFieldInfo.FieldName = $"{FixName(metadata.GetStringFromIndex(typeDef.nameIndex))}_{structFieldInfo.FieldName}";
                 }
                 fields.Add(structFieldInfo);
             }
         }
     }
 }