refactor!: Identifiable interface extracted from IEntity
This commit is contained in:
@@ -1,39 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Engine.Core.Serialization;
|
||||
|
||||
public class EntityRegistry
|
||||
{
|
||||
public Event<EntityRegistry, EntityRegisteredArguments> OnEntityRegistered = null!;
|
||||
|
||||
private readonly Dictionary<string, Action<IEntity>?> assignCallbacks = [];
|
||||
private readonly Dictionary<string, IEntity> registeredEntities = [];
|
||||
public IReadOnlyDictionary<string, IEntity> RegisteredEntities => registeredEntities;
|
||||
|
||||
public void Add(IEntity entity)
|
||||
{
|
||||
if (registeredEntities.TryAdd(entity.Id, entity))
|
||||
OnEntityRegistered?.Invoke(this, new(entity));
|
||||
}
|
||||
|
||||
public void QueueAssign(string id, Action<IEntity> setMethod)
|
||||
{
|
||||
assignCallbacks.TryAdd(id, null);
|
||||
assignCallbacks[id] = assignCallbacks[id] + setMethod;
|
||||
}
|
||||
|
||||
public void AssignAll()
|
||||
{
|
||||
foreach ((string id, Action<IEntity>? action) in assignCallbacks)
|
||||
action?.Invoke(registeredEntities[id]);
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
assignCallbacks.Clear();
|
||||
registeredEntities.Clear();
|
||||
}
|
||||
|
||||
public readonly record struct EntityRegisteredArguments(IEntity Entity);
|
||||
}
|
||||
39
Engine.Core/Serialization/IdentifiableRegistry.cs
Normal file
39
Engine.Core/Serialization/IdentifiableRegistry.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Engine.Core.Serialization;
|
||||
|
||||
public class IdentifiableRegistry
|
||||
{
|
||||
public Event<IdentifiableRegistry, EntityRegisteredArguments> OnEntityRegistered = null!;
|
||||
|
||||
private readonly Dictionary<string, Action<IIdentifiable>?> assignCallbacks = [];
|
||||
private readonly Dictionary<string, IIdentifiable> registeredEntities = [];
|
||||
public IReadOnlyDictionary<string, IIdentifiable> RegisteredEntities => registeredEntities;
|
||||
|
||||
public void Add(IIdentifiable identifiable)
|
||||
{
|
||||
if (registeredEntities.TryAdd(identifiable.Id, identifiable))
|
||||
OnEntityRegistered?.Invoke(this, new(identifiable));
|
||||
}
|
||||
|
||||
public void QueueAssign(string id, Action<IIdentifiable> setMethod)
|
||||
{
|
||||
assignCallbacks.TryAdd(id, null);
|
||||
assignCallbacks[id] = assignCallbacks[id] + setMethod;
|
||||
}
|
||||
|
||||
public void AssignAll()
|
||||
{
|
||||
foreach ((string id, Action<IIdentifiable>? action) in assignCallbacks)
|
||||
action?.Invoke(registeredEntities[id]);
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
assignCallbacks.Clear();
|
||||
registeredEntities.Clear();
|
||||
}
|
||||
|
||||
public readonly record struct EntityRegisteredArguments(IIdentifiable Entity);
|
||||
}
|
||||
@@ -43,8 +43,8 @@ public class SerializedClass
|
||||
continue;
|
||||
|
||||
object? value = privatePropertyInfo.GetValue(@class);
|
||||
if (value is IEntity entity)
|
||||
Private.Add(privatePropertyInfo.Name, entity.Id);
|
||||
if (value is IIdentifiable identifiable)
|
||||
Private.Add(privatePropertyInfo.Name, identifiable.Id);
|
||||
else
|
||||
Private.Add(privatePropertyInfo.Name, value);
|
||||
}
|
||||
@@ -61,8 +61,8 @@ public class SerializedClass
|
||||
continue;
|
||||
|
||||
object? value = publicPropertyInfo.GetValue(@class);
|
||||
if (value is IEntity entity)
|
||||
Public.Add(publicPropertyInfo.Name, entity.Id);
|
||||
if (value is IIdentifiable identifiable)
|
||||
Public.Add(publicPropertyInfo.Name, identifiable.Id);
|
||||
else
|
||||
Public.Add(publicPropertyInfo.Name, value);
|
||||
}
|
||||
@@ -76,8 +76,8 @@ public class SerializedClass
|
||||
continue;
|
||||
|
||||
object? value = privateFieldInfo.GetValue(@class);
|
||||
if (value is IEntity entity)
|
||||
Private.Add(privateFieldInfo.Name, entity.Id);
|
||||
if (value is IIdentifiable identifiable)
|
||||
Private.Add(privateFieldInfo.Name, identifiable.Id);
|
||||
else
|
||||
Private.Add(privateFieldInfo.Name, value);
|
||||
}
|
||||
@@ -91,8 +91,8 @@ public class SerializedClass
|
||||
continue;
|
||||
|
||||
object? value = publicFieldInfo.GetValue(@class);
|
||||
if (value is IEntity entity)
|
||||
Public.Add(publicFieldInfo.Name, entity.Id);
|
||||
if (value is IIdentifiable identifiable)
|
||||
Public.Add(publicFieldInfo.Name, identifiable.Id);
|
||||
else
|
||||
Public.Add(publicFieldInfo.Name, value);
|
||||
}
|
||||
@@ -112,36 +112,36 @@ public class SerializedClass
|
||||
return instance;
|
||||
}
|
||||
|
||||
public object CreateInstance(EntityRegistry? entityRegistry)
|
||||
public object CreateInstance(IdentifiableRegistry? identifiableRegistry)
|
||||
{
|
||||
if (entityRegistry is null)
|
||||
if (identifiableRegistry is null)
|
||||
return CreateInstance();
|
||||
|
||||
Type type = TypeFactory.GetType(Type);
|
||||
object instance = TypeFactory.Get(type);
|
||||
|
||||
foreach ((string key, object? value) in Private)
|
||||
AssignVariable(key, type, instance, value, PRIVATE_BINDING_FLAGS, entityRegistry);
|
||||
AssignVariable(key, type, instance, value, PRIVATE_BINDING_FLAGS, identifiableRegistry);
|
||||
|
||||
foreach ((string key, object? value) in Public)
|
||||
AssignVariable(key, type, instance, value, PUBLIC_BINDING_FLAGS, entityRegistry);
|
||||
AssignVariable(key, type, instance, value, PUBLIC_BINDING_FLAGS, identifiableRegistry);
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
private static void AssignVariable(string key, Type type, object instance, object? value, BindingFlags bindingFlags, EntityRegistry entityRegistry)
|
||||
private static void AssignVariable(string key, Type type, object instance, object? value, BindingFlags bindingFlags, IdentifiableRegistry identifiableRegistry)
|
||||
{
|
||||
if (type.GetField(key, bindingFlags) is FieldInfo fieldInfo)
|
||||
{
|
||||
if (typeof(IEntity).IsAssignableFrom(fieldInfo.FieldType))
|
||||
entityRegistry.QueueAssign(value?.ToString() ?? "", (entity) => fieldInfo.SetValue(instance, entity));
|
||||
if (typeof(IIdentifiable).IsAssignableFrom(fieldInfo.FieldType))
|
||||
identifiableRegistry.QueueAssign(value?.ToString() ?? "", (entity) => fieldInfo.SetValue(instance, entity));
|
||||
else
|
||||
fieldInfo.SetValue(instance, value);
|
||||
}
|
||||
else if (type.GetProperty(key, bindingFlags) is PropertyInfo propertyInfo)
|
||||
{
|
||||
if (typeof(IEntity).IsAssignableFrom(propertyInfo.PropertyType))
|
||||
entityRegistry.QueueAssign(value?.ToString() ?? "", (entity) => propertyInfo.SetValue(instance, entity));
|
||||
if (typeof(IIdentifiable).IsAssignableFrom(propertyInfo.PropertyType))
|
||||
identifiableRegistry.QueueAssign(value?.ToString() ?? "", (entity) => propertyInfo.SetValue(instance, entity));
|
||||
else
|
||||
propertyInfo.SetValue(instance, value);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user