using System.Reflection; using Syntriax.Engine.Core; namespace Syntriax.Engine.Serialization; public class SerializedEntity { public string Id { get; set; } = string.Empty; public string Type { get; set; } = string.Empty; public Dictionary Public = []; public Dictionary Private = []; public SerializedEntity() { } public SerializedEntity(object entity) { Type type = entity.GetType(); Type = type.FullName ?? throw new($"Object {entity} has no {nameof(System.Type.FullName)}"); Id = type.GetProperty(nameof(IEntity.Id), BindingFlags.Instance | BindingFlags.Public)?.GetValue(entity)?.ToString() ?? string.Empty; foreach (PropertyInfo privatePropertyInfo in Utils.GetPropertyInfosIncludingBaseClasses(type, BindingFlags.Instance | BindingFlags.NonPublic)) { if (privatePropertyInfo.HasAttribute()) continue; Private.Add(privatePropertyInfo.Name, privatePropertyInfo.GetValue(entity)); } foreach (PropertyInfo publicPropertyInfo in Utils.GetPropertyInfosIncludingBaseClasses(type, BindingFlags.Instance | BindingFlags.Public)) { if (publicPropertyInfo.HasAttribute()) continue; Public.Add(publicPropertyInfo.Name, publicPropertyInfo.GetValue(entity)); } foreach (FieldInfo privateFieldInfo in Utils.GetFieldInfosIncludingBaseClasses(type, BindingFlags.Instance | BindingFlags.NonPublic)) { if (privateFieldInfo.HasAttribute()) continue; // if (!privateFieldInfo.HasAttribute()) // continue; Private.Add(privateFieldInfo.Name, privateFieldInfo.GetValue(entity)); } foreach (FieldInfo publicFieldInfo in Utils.GetFieldInfosIncludingBaseClasses(type, BindingFlags.Instance | BindingFlags.Public)) { if (publicFieldInfo.HasAttribute()) continue; // if (!publicFieldInfo.HasAttribute()) // continue; Public.Add(publicFieldInfo.Name, publicFieldInfo.GetValue(entity)); } } }