Пример #1
0
        internal static void CheckConsistency(StateObject obj, StateManager container)
        {
            if (obj == null)
            {
                return;
            }

            obj.container = container;

            Type type = obj.GetType();

            FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            for (int i = 0; i < fields.Length; i++)
            {
                Type fieldtype = fields[i].FieldType;
                if (typeof(IDataID).IsAssignableFrom(fieldtype))
                {
                }
                else if (typeof(IStateLink).IsAssignableFrom(fieldtype))
                {
                    IStateLink t = (IStateLink)fields[i].GetValue(obj);
                    if (t != null)
                    {
                        if (t.Object == null)
                        {
                            throw new BurntimeLogicException();
                        }
                    }
                }
                else if (typeof(IStateLinkList).IsAssignableFrom(fieldtype))
                {
                    IStateLinkList t = (IStateLinkList)fields[i].GetValue(obj);
                    if (t != null)
                    {
                        for (int j = 0; j < t.List.Count; j++)
                        {
                            t.List[j].Container = container;
                            if (t.List[j].Object == null)
                            {
                                throw new BurntimeLogicException();
                            }
                        }
                    }
                }
                else if (!fieldtype.IsValueType && fieldtype != typeof(StateManager) &&
                         !fieldtype.IsArray && !fields[i].IsNotSerialized && fieldtype != typeof(String))
                {
                    throw new Exception("StateObject members must be ValueType, StateLinks or NonSerialized.");
                }
            }
        }
Пример #2
0
        void Mark(StateObject obj, Dictionary <int, bool> mark)
        {
            if (obj == null)
            {
                throw new BurntimeLogicException();
            }

            if (obj.ID == -1 || !mark[obj.ID])
            {
                return;
            }

            mark[obj.ID] = false;

            Type type = obj.GetType();

            FieldInfo[] infos = type.GetFields(BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            foreach (FieldInfo info in infos)
            {
                if (typeof(IStateLink).IsAssignableFrom(info.FieldType))
                {
                    IStateLink link = (IStateLink)info.GetValue(obj);
                    if (link == null)
                    {
                        continue;
                    }
                    Mark(link.Object, mark);
                }
                else if (typeof(IStateLinkList).IsAssignableFrom(info.FieldType))
                {
                    IStateLinkList list = (IStateLinkList)info.GetValue(obj);
                    if (list == null)
                    {
                        continue;
                    }
                    List <IStateLink> linkList = list.List;
                    for (int i = 0; i < linkList.Count; i++)
                    {
                        Mark(linkList[i].Object, mark);
                    }
                    list.List = linkList;
                }
                else if (!info.FieldType.IsValueType && info.FieldType != typeof(StateManager) &&
                         !info.FieldType.IsArray && !info.IsNotSerialized && info.FieldType != typeof(String))
                {
                    throw new Exception("StateObject members must be ValueType, StateLinks or NonSerialized.");
                }
            }
        }
Пример #3
0
        void ResolveStateLinks(ref StateObject obj, Dictionary <int, int> localToGlobal)
        {
            Type type = obj.GetType();

            FieldInfo[] infos = type.GetFields(BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            foreach (FieldInfo info in infos)
            {
                if (typeof(IStateLink).IsAssignableFrom(info.FieldType))
                {
                    IStateLink link = (IStateLink)info.GetValue(obj);
                    if (link == null)
                    {
                        continue;
                    }
                    if (link.ID == -1)
                    {
                        link.ID = localToGlobal[link.localID];
                        info.SetValue(obj, link);
                    }
                }
                else if (typeof(IStateLinkList).IsAssignableFrom(info.FieldType))
                {
                    IStateLinkList list = (IStateLinkList)info.GetValue(obj);
                    if (list == null)
                    {
                        continue;
                    }
                    List <IStateLink> linkList = list.List;
                    for (int i = 0; i < linkList.Count; i++)
                    {
                        if (linkList[i].ID == -1)
                        {
                            IStateLink link = linkList[i];
                            link.ID     = localToGlobal[linkList[i].localID];
                            linkList[i] = link;
                        }
                    }
                    list.List = linkList;
                }
                else if (!info.FieldType.IsValueType && info.FieldType != typeof(StateManager) &&
                         !info.FieldType.IsArray && !info.IsNotSerialized && info.FieldType != typeof(String) &&
                         info.FieldType.IsSubclassOf(typeof(EventHandler)))
                {
                    throw new Exception("StateObject members must be ValueType, StateLinks or NonSerialized.");
                }
            }
        }
Пример #4
0
        void ResolveStateLinks(ref StateObject obj, Dictionary <int, int> localToGlobal)
        {
            Type type = obj.GetType();

            FieldInfo[] infos = type.GetFields(BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            foreach (FieldInfo info in infos)
            {
                if (typeof(IStateLink).IsAssignableFrom(info.FieldType))
                {
                    IStateLink link = (IStateLink)info.GetValue(obj);
                    if (link == null)
                    {
                        continue;
                    }
                    if (link.ID == -1)
                    {
                        link.ID = added[link.localID].ID;
                    }
                    info.SetValue(obj, link);
                }
                else if (typeof(IStateLinkList).IsAssignableFrom(info.FieldType))
                {
                    IStateLinkList list = (IStateLinkList)info.GetValue(obj);
                    if (list == null)
                    {
                        continue;
                    }
                    List <IStateLink> linkList = list.List;
                    for (int i = 0; i < linkList.Count; i++)
                    {
                        if (linkList[i].ID == -1)
                        {
                            IStateLink link = linkList[i];
                            link.ID     = added[linkList[i].localID].ID;
                            linkList[i] = link;
                        }
                    }
                    list.List = linkList;
                }
            }
        }
Пример #5
0
        internal static void SetManager(StateObject obj, StateManager container)
        {
            if (obj == null)
            {
                return;
            }

            obj.container = container;

            Type type = obj.GetType();

            FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            for (int i = 0; i < fields.Length; i++)
            {
                Type fieldtype = fields[i].FieldType;
                if (typeof(IDataID).IsAssignableFrom(fieldtype))
                {
                    IDataID data = (IDataID)fields[i].GetValue(obj);
                    data.ResMan = container.ResourceManager;
                    fields[i].SetValue(obj, data);
                }
                else if (fieldtype.IsArray)
                {
                    Array array = (Array)fields[i].GetValue(obj);
                    for (int j = 0; j < array.Length; j++)
                    {
                        IDataID item = array.GetValue(j) as IDataID;
                        if (item != null)
                        {
                            ((IDataID)item).ResMan = container.ResourceManager;
                            array.SetValue(item, j);
                        }
                    }
                    fields[i].SetValue(obj, array);
                }
                //else if (fieldtype.IsSubclassOf(typeof(StateObject)))
                //{
                //    StateObject t = (StateObject)fields[i].GetValue(obj);
                //    SetManager(t, container);
                //    fields[i].SetValue(obj, t);
                //}
                else if (typeof(IStateLink).IsAssignableFrom(fieldtype))
                {
                    IStateLink t = (IStateLink)fields[i].GetValue(obj);
                    if (t != null)
                    {
                        t.Container = container;
                        fields[i].SetValue(obj, t);
                    }
                }
                else if (typeof(IStateLinkList).IsAssignableFrom(fieldtype))
                {
                    IStateLinkList t = (IStateLinkList)fields[i].GetValue(obj);
                    if (t != null)
                    {
                        t.Container = container;
                        for (int j = 0; j < t.List.Count; j++)
                        {
                            t.List[j].Container = container;
                        }
                        fields[i].SetValue(obj, t);
                    }
                }
                else if (!fieldtype.IsValueType && fieldtype != typeof(StateManager) &&
                         !fieldtype.IsArray && !fields[i].IsNotSerialized && fieldtype != typeof(String))
                {
                    throw new Exception("StateObject members must be ValueType, StateLinks or NonSerialized.");
                }
            }
        }