public static Action <TTarget, TProperty> BuildSetter <TTarget, TProperty>(PropertyInfo property)
        {
            // TODO: Make sure the property belongs to TTarget

            if (property is null)
            {
                throw new ArgumentNullException(nameof(property));
            }
            if (property.PropertyType != typeof(TProperty))
            {
                throw new InvalidOperationException();
            }

            var targetExpr = Expression.Parameter(typeof(TTarget));
            var valueExpr  = Expression.Parameter(typeof(TProperty));

            var setterExpr = ExpressionHelpers.BuildSetterExpression(targetExpr, property, valueExpr);

            return(Expression.Lambda <Action <TTarget, TProperty> >(setterExpr, targetExpr, valueExpr)
                   .Compile());
        }
        public static Action <TTarget, TField> BuildSetter <TTarget, TField>(FieldInfo field)
        {
            // TODO: Make sure the field belongs to TTarget

            if (field is null)
            {
                throw new ArgumentNullException(nameof(field));
            }
            if (field.FieldType != typeof(TField))
            {
                throw new InvalidOperationException();
            }

            var targetExpr = Expression.Parameter(typeof(TTarget));
            var valueExpr  = Expression.Parameter(typeof(TField));

            var setterExpr = ExpressionHelpers.BuildSetterExpression(targetExpr, field, valueExpr);

            return(Expression.Lambda <Action <TTarget, TField> >(setterExpr, targetExpr, valueExpr)
                   .Compile());
        }