public StateReference <T> GetReference <T>(StateObject obj) where T : StateObject { StateReference <T> reference = new StateReference <T>(); IStateLink link = reference as IStateLink; link.Container = this; link.ID = obj.ID; link.localID = obj.localID; externalReferences.Add(reference); return(reference); }
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."); } } }
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."); } } }
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."); } } }
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; } } }
/// <summary> /// Adds a link to another state /// </summary> /// <param name="link">The link to add</param> public void AddStateLink(IStateLink link) { StateLinks.Add(link); }
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."); } } }