public static object Parse(Type t, object data)
        {
            if (t.BaseType != typeof(StructData))
            {
                return(null);
            }

            StructData obj = (StructData)Activator.CreateInstance(t);

            obj.Parse(data);
            return(obj);
        }
        public void CopyFrom(IData data)
        {
            if (!typeof(StructData).IsAssignableFrom(data.GetType()))
            {
                Debugger.LogError("BaseData", "can not copy data with not the same type");
                return;
            }

            StructData strct = (StructData)data;

            foreach (KeyValuePair <string, IData> kv in strct.Fields)
            {
                if (this[kv.Key] != null)
                {
                    this[kv.Key].CopyFrom(kv.Value);
                }
            }
        }
        public void Parse(object data)
        {
            Type objtype  = this.GetType();
            Type datatype = data.GetType();

            List <ParseStruct> all = new List <ParseStruct>();

            FieldInfo[] datafields = datatype.GetFields();
            for (int i = 0; i < datafields.Length; i++)
            {
                FieldInfo datafi = datafields[i];
                object    datav  = datafi.GetValue(data);
                if (datav == null)
                {
                    continue;
                }

                all.Add(new ParseStruct()
                {
                    Name  = datafi.Name,
                    Type  = datafi.FieldType,
                    Value = datav
                });
            }

            PropertyInfo[] dataproperties = datatype.GetProperties();
            for (int i = 0; i < dataproperties.Length; i++)
            {
                PropertyInfo property = dataproperties[i];
                object       datav    = property.GetValue(data);
                if (datav == null)
                {
                    continue;
                }

                all.Add(new ParseStruct()
                {
                    Name  = property.Name,
                    Type  = property.PropertyType,
                    Value = datav
                });
            }

            for (int i = 0; i < all.Count; i++)
            {
                ParseStruct parseStruct = all[i];

                FieldInfo objfi = objtype.GetField(parseStruct.Name);
                if (objfi == null || !typeof(IData).IsAssignableFrom(objfi.FieldType))
                {
                    continue;
                }

                bool isList   = objfi.FieldType.IsGenericType && objfi.FieldType.GetGenericTypeDefinition() == typeof(ListData <>);
                bool isDict   = objfi.FieldType.IsGenericType && objfi.FieldType.GetGenericTypeDefinition() == typeof(DictionaryData <>);
                bool isStruct = typeof(StructData).IsAssignableFrom(objfi.FieldType);
                bool isBase   = objfi.FieldType.BaseType.IsGenericType && objfi.FieldType.BaseType.GetGenericTypeDefinition() == typeof(BaseData <>) && objfi.FieldType.BaseType.GetGenericArguments()[0] == parseStruct.Type;

                object objv = objfi.GetValue(this);
                if (objv != null)
                {
                    if (isList)
                    {
                        (objv as IListData).ParseObject(parseStruct.Value);
                    }
                    else if (isDict)
                    {
                        (objv as IDictionaryData).ParseObject(parseStruct.Value);
                    }
                    else if (isStruct)
                    {
                        (objv as StructData).Parse(parseStruct.Value);
                    }
                    else if (isBase)
                    {
                        (objv as IBaseData).FastSetValue(parseStruct.Value);
                    }
                }
                else
                {
                    if (isList)
                    {
                        objfi.SetValue(this, ListData.Parse(objfi.FieldType.GetGenericArguments()[0], parseStruct.Value));
                    }
                    else if (isDict)
                    {
                        objfi.SetValue(this, DictionaryData.Parse(objfi.FieldType.GetGenericArguments()[0], parseStruct.Value));
                    }
                    else if (isStruct)
                    {
                        objfi.SetValue(this, StructData.Parse(objfi.FieldType, parseStruct.Value));
                    }
                    else if (isBase)
                    {
                        objfi.SetValue(this, Activator.CreateInstance(objfi.FieldType, parseStruct.Value));
                    }
                }
            }
        }