public static IDynamicBuilder <T> WithTransformedValue <T, TProperty>(this IDynamicBuilder <T> builder, Expression <Func <T, TProperty> > property, Func <TProperty, TProperty> transformation)
        {
            Assert.IsNotNull(transformation, nameof(transformation));
            var value            = builder.GetOverwrittenValue(property);
            var transformedValue = transformation(value);

            return(WithValue(builder, property, transformedValue));
        }
        public static TProperty GetOverwrittenValue <T, TProperty>(this IDynamicBuilder <T> builder, Expression <Func <T, TProperty> > property)
        {
            Assert.IsNotNull(builder, nameof(builder));
            Assert.IsNotNull(property, nameof(property));

            string name = ExtractMemberAccessor(property).Member.Name;

            return
                (builder.IsOverwritten(name)
                ? builder.GetOverwrittenValue <TProperty>(name)
                : default(TProperty));
        }
        public static IDynamicBuilder <T> WithElements <T, TElement>(this IDynamicBuilder <T> builder, Expression <Func <T, IEnumerable <TElement> > > enumerableProperty, IEnumerable <TElement> elements)
        {
            var value = builder.GetOverwrittenValue(enumerableProperty);

            if (value == null)
            {
                value = elements;
            }
            else
            {
                value = value.Concat(elements);
            }
            return(WithValue(builder, enumerableProperty, value));
        }
        public static IDynamicBuilder <T> WithBuilderDependentElement <T, TElement>(this IDynamicBuilder <T> builder, Expression <Func <T, IEnumerable <TElement> > > enumerableProperty, Func <IDynamicBuilder <T>, TElement> getElement)
        {
            Assert.IsNotNull(builder, nameof(builder));
            Assert.IsNotNull(getElement, nameof(getElement));
            var element = getElement(builder);
            var value   = builder.GetOverwrittenValue(enumerableProperty);

            if (value == null)
            {
                value = new[] { element }
            }
            ;
            else
            {
                value = value.Concat(new[] { element });
            }
            return(WithBuilderDependentValue(builder, enumerableProperty, b => value));
        }
        public static IDynamicBuilder <T> WithElement <T, TElement>(this IDynamicBuilder <T> builder, Expression <Func <T, IEnumerable <TElement> > > enumerableProperty, TElement element)
        {
            var value = builder.GetOverwrittenValue(enumerableProperty);

            if (value == null)
            {
                value = new[] { element }
            }
            ;
            else if (value is ICollection <TElement> collection && !collection.IsReadOnly)
            {
                collection.Add(element);
            }
            else
            {
                value = value.Concat(new[] { element });
            }
            return(WithValue(builder, enumerableProperty, value));
        }
 public static TProperty GetOverwrittenValue <TProperty>(this IDynamicBuilder builder, string name) =>
 (TProperty)builder.GetOverwrittenValue(name);