private List <FieldDefinition> GetAcceptableFields(TypeDefWithSelfRef typeDef) { List <FieldDefinition> validFields = new List <FieldDefinition>(); foreach (FieldDefinition f in typeDef.typeDef.Fields) { if (HasFlag(f.Attributes, FieldAttributes.Public) || f.CustomAttributes.Any(a => a.AttributeType.Name.Equals("SerializeField"))) //field is public or has exception attribute { if (!HasFlag(f.Attributes, FieldAttributes.Static) && !HasFlag(f.Attributes, FieldAttributes.NotSerialized) && !f.IsInitOnly && !f.HasConstant) //field is not public, has exception attribute, readonly, or const { TypeDefWithSelfRef ft = typeDef.SolidifyType(f.FieldType); TypeDefinition ftd = ft.typeDef; if (ftd != null) { if (ftd.IsPrimitive || ftd.IsEnum || ftd.IsSerializable || DerivesFromUEObject(ftd) || IsSpecialUnityType(ftd)) //field has a serializable type { validFields.Add(f); } } } } } return(validFields); }
private List <AssetTypeTemplateField> ReadTypes(TypeDefWithSelfRef type) { List <FieldDefinition> acceptableFields = GetAcceptableFields(type); List <AssetTypeTemplateField> localChildren = new List <AssetTypeTemplateField>(); for (int i = 0; i < acceptableFields.Count; i++) { AssetTypeTemplateField field = new AssetTypeTemplateField(); FieldDefinition fieldDef = acceptableFields[i]; TypeDefWithSelfRef fieldTypeDef = type.SolidifyType(fieldDef.FieldType); string fieldTypeName = fieldTypeDef.typeDef.Name; bool isArrayOrList = false; if (fieldTypeDef.typeRef.MetadataType == MetadataType.Array) { ArrayType arrType = (ArrayType)fieldTypeDef.typeRef; isArrayOrList = arrType.IsVector; } else if (fieldTypeDef.typeDef.FullName == "System.Collections.Generic.List`1") { fieldTypeDef = fieldTypeDef.typeParamToArg.First().Value; fieldTypeName = fieldTypeDef.typeDef.Name; isArrayOrList = true; } field.name = fieldDef.Name; field.type = ConvertBaseToPrimitive(fieldTypeName); if (IsPrimitiveType(fieldTypeDef)) { field.childrenCount = 0; field.children = new AssetTypeTemplateField[] { }; } else if (fieldTypeDef.typeDef.Name.Equals("String")) { SetString(field); } else if (IsSpecialUnityType(fieldTypeDef)) { SetSpecialUnity(field, fieldTypeDef); } else if (DerivesFromUEObject(fieldTypeDef)) { SetPPtr(field, true); } else if (fieldTypeDef.typeDef.IsSerializable) { SetSerialized(field, fieldTypeDef); } if (fieldTypeDef.typeDef.IsEnum) { field.valueType = EnumValueTypes.Int32; } else { field.valueType = AssetTypeValueField.GetValueTypeByTypeName(field.type); } field.align = TypeAligns(field.valueType); field.hasValue = field.valueType != EnumValueTypes.None; if (isArrayOrList) { field = SetArray(field); } localChildren.Add(field); } return(localChildren); }