public bool Parse(TypeFieldDesc desc) { this.Name = desc.Name; this.Type = desc.Type; this.Category = desc.Category; this.Default = desc.Default; this.Limit = desc.Limit; if (desc.Type.StartsWith("Array<") && desc.Type.EndsWith(">")) { this.Type = GType.Array; int preLength = 6; // "Array<".Length string innerStr = desc.Type.Substring(preLength, desc.Type.Length - preLength - 1); this.SubTypes = new string[1]; this.SubTypes[0] = innerStr.Trim(); } else if (desc.Type.StartsWith("List<") && desc.Type.EndsWith(">")) { this.Type = GType.List; int preLength = 5; // "List<".Length string innerStr = desc.Type.Substring(preLength, desc.Type.Length - preLength - 1); this.SubTypes = new string[1]; this.SubTypes[0] = innerStr.Trim(); } else if (desc.Type.Contains("Map<") && desc.Type.Contains(">")) { this.Type = GType.Map; int preLength = 4; // "Map<".Length string innerStr = desc.Type.Substring(preLength, desc.Type.Length - preLength - 1); string[] splits = innerStr.Split(','); if (splits.Length != 2) { GLog.LogError("Parse Type {0} failed!", desc.Type); return(false); } this.SubTypes = new string[2]; this.SubTypes[0] = splits[0].Trim(); this.SubTypes[1] = splits[1].Trim(); } else { this.Type = desc.Type; } // check errors if (string.IsNullOrEmpty(this.Name)) { GLog.LogError("GType.Field.Parse: 'Name' is required"); return(false); } if (string.IsNullOrEmpty(this.Type)) { GLog.LogError("GType.Field.Parse: 'Type' is required"); return(false); } return(true); }
static bool ConvertSingle(Type cstp, List <TypeDesc> list) { object[] attrs = cstp.GetCustomAttributes(typeof(ExpandSerializeAttribute), false); if (attrs.Length == 0) { return(false); } ExpandSerializeAttribute attr = (ExpandSerializeAttribute)attrs[0]; TypeDesc desc = new TypeDesc(); TypeDesc subDesc = new TypeDesc(); desc.Gen_Head = false; desc.Gen_Serialize = true; desc.Gen_Deserialize = false; desc.Tt = TypeDesc.TT.Class; desc.CompileTo = CompileTarget.CSharp; desc.Name = cstp.Name; desc.Namespace = cstp.Namespace; desc.Fields = new List <TypeFieldDesc>(); subDesc.Gen_Head = true; subDesc.Gen_Serialize = true; subDesc.Gen_Deserialize = true; subDesc.Tt = TypeDesc.TT.Class; subDesc.CompileTo = CompileTarget.CSharp; subDesc.Name = string.Format(attr.subClassName, cstp.Name); subDesc.Namespace = cstp.Namespace; subDesc.Fields = new List <TypeFieldDesc>(); object[] parentAttrs = cstp.BaseType.GetCustomAttributes(typeof(ExpandSerializeAttribute), false); if (parentAttrs.Length > 0) { desc.Parent = cstp.BaseType.Name; subDesc.Parent = string.Format(((ExpandSerializeAttribute)parentAttrs[0]).subClassName, cstp.BaseType.Name); } foreach (var fieldInfo in cstp.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { if (fieldInfo.GetCustomAttributes(typeof(GenFieldAttribute), true).Length > 0) { TypeFieldDesc fieldDesc = new TypeFieldDesc(); fieldDesc.Name = fieldInfo.Name; if (fieldInfo.FieldType.IsGenericType) { Type genericType = fieldInfo.FieldType.GetGenericTypeDefinition(); string genericTypeName = genericType.Name.Remove(genericType.Name.IndexOf('`')); switch (genericTypeName) { case "List": { fieldDesc.Type = string.Format("List<{0}>", fieldInfo.FieldType.GetGenericArguments()[0].Name); } break; } } else { fieldDesc.Type = BaseTypeMap(fieldInfo.FieldType); } fieldDesc.Type = BaseTypeMap(fieldInfo.FieldType); desc.Fields.Add(fieldDesc); subDesc.Fields.Add(fieldDesc); } else if (fieldInfo.GetCustomAttributes(typeof(GenUidAttribute), true).Length > 0) { TypeFieldDesc fieldDesc = new TypeFieldDesc(); TypeFieldDesc subDescField = new TypeFieldDesc(); fieldDesc.Name = fieldInfo.Name; subDescField.Name = fieldInfo.Name; if (fieldInfo.FieldType.IsGenericType) { Type genericType = fieldInfo.FieldType.GetGenericTypeDefinition(); string genericTypeName = genericType.Name.Remove(genericType.Name.IndexOf('`')); switch (genericTypeName) { case "List": { fieldDesc.Type = "List<Handle>"; subDescField.Type = "Array<int>"; } break; } } else { fieldDesc.Type = "Handle"; subDescField.Type = "int"; } desc.Fields.Add(fieldDesc); subDesc.Fields.Add(subDescField); } } list.Add(desc); list.Add(subDesc); return(true); }