public EntityValidationHelper <TEntity> Validate <TConditionalValue>(
            Expression <Func <TEntity, TConditionalValue> > memberExpression,
            Func <TEntity, bool> conditionalToCheck,
            Func <TEntity, TConditionalValue> calculateConditionalValue,
            Func <TEntity, TConditionalValue, bool> conditional,
            string errorMessage,
            bool format = true,
            EValidationKind validationKind = EValidationKind.Error)
        {
            lock (_syncValidations)
            {
                if (!(conditionalToCheck?.Invoke(Current) ?? true))
                {
                    return(this);
                }

                var conditionalValue = calculateConditionalValue(Current);
                if (!conditional(Current, conditionalValue))
                {
                    return(this);
                }

                var member = XHelper.Expressions.GetMemberName(memberExpression);
                var displayPropertyValue = TypeDescriptor.GetModelDisplayName(Current);

                Validations.Add(CreateValidation(
                                    validationKind,
                                    format
                        ? string.Format(errorMessage, TypeDescriptor.GetPropertyDisplayName(member, false), conditionalValue, displayPropertyValue)
                        : errorMessage));

                return(this);
            }
        }
 public EntityValidationHelper <TEntity> IfNoViolationsValidate(
     Expression <Func <TEntity, object> > memberExpression,
     Func <TEntity, bool> conditional,
     string errorMessage,
     bool format = true,
     EValidationKind validationKind = EValidationKind.Error)
 {
     lock (_syncValidations)
     {
         return(HasViolations ? this : Validate(memberExpression, conditional, errorMessage, format, validationKind));
     }
 }
        private ValidationResult CreateValidation(EValidationKind validationKind, string message)
        {
            switch (validationKind)
            {
            case EValidationKind.Error:
                return(new ValidationResult(message));

            case EValidationKind.Warning:
                return(new WarningValidationResult(message));

            default:
                throw new ArgumentOutOfRangeException(nameof(validationKind));
            }
        }
 public EntityValidationHelper <TEntity> Validate <TConditionalValue>(
     Expression <Func <TEntity, TConditionalValue> > memberExpression,
     Func <TEntity, TConditionalValue> calculateConditionalValue,
     Func <TEntity, TConditionalValue, bool> conditional,
     string errorMessage,
     bool format = true,
     EValidationKind validationKind = EValidationKind.Error) =>
 Validate(
     memberExpression,
     null,
     calculateConditionalValue,
     conditional,
     errorMessage,
     format,
     validationKind);