public static ValidateTarget <TValue?> IsInRange <TValue>([ValidatedNotNull] this ValidateTarget <TValue?> target, object minValue, object maxValue, Func <string> getErrorMessage = null, System.Collections.IComparer customComparer = null)
            where TValue : struct, IComparable
        {
            if (target.Value.HasValue)
            {
                System.Collections.IComparer comparer = customComparer ?? Comparer <TValue> .Default;
                if (comparer.Compare(target.Value.Value, minValue) < 0 || comparer.Compare(target.Value.Value, maxValue) > 0)
                {
                    ExceptionFactory.ThrowException(target.Traits.OutOfRangeExceptionType, getErrorMessage != null ? getErrorMessage.Invoke() : ErrorMessageFactory.ShouldBeInRange(target, minValue, maxValue));
                }
            }

            return(target);
        }
        public static ValidateTarget <TValue> IsInRange <TValue>([ValidatedNotNull] this ValidateTarget <TValue> target, TValue minValue, TValue maxValue, Func <string> getErrorMessage = null, IComparer <TValue> customComparer = null)
            where TValue : IComparable <TValue>
        {
            IComparer <TValue> comparer = customComparer ?? Comparer <TValue> .Default;

            if (comparer.Compare(target.Value, minValue) < 0 || comparer.Compare(target.Value, maxValue) > 0)
            {
                ExceptionFactory.ThrowException(target.Traits.OutOfRangeExceptionType, getErrorMessage != null ? getErrorMessage.Invoke() : ErrorMessageFactory.ShouldBeInRange(target, minValue, maxValue));
            }

            return(target);
        }
        public static ValidateTarget <double?> IsInRange([ValidatedNotNull] this ValidateTarget <double?> target, double minValue, double maxValue, double allowedError, Func <string> getErrorMessage = null)
        {
            if (target.Value.HasValue)
            {
                var diffFromMin = Math.Abs(target.Value.Value - minValue);
                var diffFromMax = Math.Abs(target.Value.Value - maxValue);
                if ((diffFromMin > allowedError && target.Value.Value < minValue) || (diffFromMax > allowedError && target.Value.Value > maxValue))
                {
                    ExceptionFactory.ThrowException(target.Traits.OutOfRangeExceptionType, getErrorMessage != null ? getErrorMessage.Invoke() : ErrorMessageFactory.ShouldBeInRange(target, minValue, maxValue));
                }
            }

            return(target);
        }