using Modules.Library.Domain.Entities.MediaContent.CommonProperties; using Modules.Library.Domain.Entities.MediaContent.Items.Anime; using System.Linq.Expressions; using System.Reflection; namespace Modules.Library.Domain.EntityBuilders; public abstract class AnimeItemBuilder : EntityBuilder where TAnimeItem : AnimeItem { protected CommonPropertiesBuilder? _commonPropertiesBuilder; protected CommonProperties? _commonProperties = null; protected AnimeTitle _title = default!; private ushort? _order = null; protected int? _number = null; private bool? _completed = null; private TimeSpan? _expirationTime = null; public AnimeItemBuilder SetCommonProperties(CommonPropertiesBuilder builder) { _commonPropertiesBuilder = builder; return this; } public AnimeItemBuilder SetOrder(ushort value) { _order = value; return this; } public AnimeItemBuilder SetNumber(int? value) { _number = value; return this; } public AnimeItemBuilder Completed() { _completed = true; return this; } public AnimeItemBuilder SetExpirationTime(TimeSpan value) { _expirationTime = value; return this; } public override TAnimeItem Build() => throw new NotImplementedException(); protected void BuildLoaclObjects() { if (_commonPropertiesBuilder != null) _commonProperties = _commonPropertiesBuilder.BuildObject(); } //AnimeItemBuilder itemBuilder, AnimeEpisode item, protected static Action, TAnimeItem> AddFields(List fields) { var type = typeof(AnimeEpisode); var builderType = typeof(AnimeItemBuilder); var builder = Expression.Parameter(builderType, "builder"); var entity = Expression.Parameter(type, "entity"); var expressions = new List(); var fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic); var members = new List(); fields.ForEach(q => { var fi = fieldInfos.FirstOrDefault(x => x.Name == q.Trim()); if (fi != null) members.Add(fi); }); foreach (var fi in members) { var field = type.GetField(fi.Name, BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) expressions.Add(Expression.Assign(Expression.Field(entity, field), Expression.Field(builder, fi))); } var lambda = Expression.Lambda, TAnimeItem>>(Expression.Block(expressions), builder, entity); return lambda.Compile(); } }