Пример #1
0
        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);
        }
Пример #2
0
        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);
        }