/// <summary> /// Marks object as in-use (setting Exists to True) such that any unmarked objects may then be garbage collected. /// </summary> public void Mark() { if (this.Existing) { return; } this.Existing = true; Type t = this.GetType(); IList <FieldInfo> listFields = SEntity.GetFieldsOrdered(t); foreach (FieldInfo field in listFields) { if (typeof(SEntity).IsAssignableFrom(field.FieldType)) { SEntity obj = field.GetValue(this) as SEntity; if (obj != null) { obj.Mark(); } } else if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(List <>) && typeof(SEntity).IsAssignableFrom(field.FieldType.GetGenericArguments()[0])) { System.Collections.IList list = (System.Collections.IList)field.GetValue(this) as System.Collections.IList; if (list != null) { foreach (object obj in list) { if (obj is SEntity) { SEntity ent = (SEntity)obj; ent.Mark(); } } } } } }