public StateObject Clone() { // simple clone value type members StateObject obj = this.MemberwiseClone() as StateObject; Type type = obj.GetType(); // state link lists need to be cloned manually FieldInfo[] infos = type.GetFields(BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); foreach (FieldInfo info in infos) { if (typeof(IStateLinkList).IsAssignableFrom(info.FieldType) && typeof(ICloneable).IsAssignableFrom(info.FieldType)) { ICloneable list = (ICloneable)info.GetValue(obj); // clone if non-null if (list != null) { info.SetValue(obj, list.Clone()); } } } StateContainer.SetManager(obj, container); // run custom after deserialization/clone initializing obj.AfterDeserialization(); return(obj); }
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; } } }
public bool CompareTo(StateObject obj) { if (obj == null) { return(false); } Type type = obj.GetType(); if (type != this.GetType()) { return(false); } FieldInfo[] infos = type.GetFields(BindingFlags.Default | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); foreach (FieldInfo info in infos) { // skip not serialized members if (info.IsNotSerialized) { continue; } if (typeof(IComparable).IsAssignableFrom(info.FieldType)) { IComparable left = (IComparable)info.GetValue(this); IComparable right = (IComparable)info.GetValue(obj); if (!CompareItems(left, right)) { return(false); } } else if (info.FieldType.IsArray) { Array left = info.GetValue(this) as Array; Array right = info.GetValue(obj) as Array; if (left == null && right == null) { return(true); } if (left == null || right == null || left.Length != right.Length) { return(false); } for (int i = 0; i < left.Length; i++) { if (!CompareOrEqualItems(left.GetValue(i), right.GetValue(i))) { return(false); } } } else { object left = info.GetValue(this); object right = info.GetValue(obj); if (!EqualItems(left, right)) { return(false); } } } return(true); }
public InvalidStateObjectConstruction(States.StateObject obj) { this.name = obj.GetType().Name; }
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."); } } }