namespace HrynCo.DAL.Abstract.Entities; public interface IEntity { DateTimeOffset Created { get; set; } object Id { get; set; } DateTimeOffset? Updated { get; set; } } public interface IEntity : IEntity where TId : struct { new TId Id { get; set; } } [Serializable] public class Entity : IEntity where TId : struct { protected Entity() { } public Entity(TId id) { Id = id; } public TId Id { get; set; } object IEntity.Id { get => Id; set { if (value is TId typedValue) { Id = typedValue; } else { throw new InvalidCastException($"Cannot cast value of type {value.GetType()} to {typeof(TId)}."); } } } public DateTimeOffset Created { get; set; } public DateTimeOffset? Updated { get; set; } } [Serializable] public abstract class Entity : Entity { protected Entity() { Id = Guid.NewGuid(); } protected Entity(Guid id) : base(id) { } } [Serializable] public abstract class NamedEntity : Entity { public required string Name { get; set; } }