using System.Collections; using System.Reflection; using Syntriax.Engine.Core; namespace Syntriax.Engine.Serialization; public class EntityFinder { private readonly HashSet _entities = []; public IReadOnlyCollection Entities => _entities; public void FindEntitiesUnder(object @object) { TypeData typeData = Utils.GetTypeData(@object.GetType()); if (@object is not IEntity entity) { if (@object is IEnumerable enumerable && @object.GetType() != typeof(string)) foreach (object? listObject in enumerable) FindEntitiesUnder(listObject); return; } if (!_entities.Add(entity)) return; foreach (PropertyInfo propertyInfo in typeData.Properties) { if (propertyInfo.PropertyType?.IsPrimitive ?? true || propertyInfo.PropertyType == typeof(string)) continue; if (propertyInfo.HasAttribute()) continue; if (propertyInfo.GetValue(@object) is object propertyObject) FindEntitiesUnder(propertyObject); } foreach (FieldInfo fieldInfo in typeData.Fields) { if (fieldInfo.FieldType?.IsPrimitive ?? true || fieldInfo.FieldType == typeof(string)) continue; if (fieldInfo.HasAttribute()) continue; // if (!fieldInfo.HasAttribute()) // continue; if (fieldInfo.GetValue(@object) is object fieldObject) FindEntitiesUnder(fieldObject); } FindEntitiesUnder(entity); } }