public void ApplyCondition(Func <object, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators)
 {
     // Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain.
     if (applyConditionTo == ApplyConditionTo.AllValidators)
     {
         foreach (var validator in Validators.ToList())
         {
             var wrappedValidator = new DelegatingValidator(predicate, validator);
             ReplaceValidator(validator, wrappedValidator);
         }
     }
     else
     {
         var wrappedValidator = new DelegatingValidator(predicate, CurrentValidator);
         ReplaceValidator(CurrentValidator, wrappedValidator);
     }
 }
        /// <summary>
        /// Specifies a condition limiting when the validator should run.
        /// The validator will only be executed if the result of the lambda returns true.
        /// </summary>
        /// <param name="rule">The current rule</param>
        /// <param name="predicate">A lambda expression that specifies a condition for when the validator should run</param>
        /// <param name="applyConditionTo">Whether the condition should be applied to the current rule or all rules in the chain</param>
        /// <returns></returns>
        public static IRuleBuilderOptions <T, TProperty> When <T, TProperty>(this IRuleBuilderOptions <T, TProperty> rule, Func <T, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators)
        {
            predicate.Guard("A predicate must be specified when calling When.");

            return(rule.Configure(config => {
                // Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain.
                if (applyConditionTo == ApplyConditionTo.AllValidators)
                {
                    foreach (var validator in config.Validators.ToList())
                    {
                        var wrappedValidator = new DelegatingValidator(x => predicate((T)x), validator);
                        config.ReplaceValidator(validator, wrappedValidator);
                    }
                }
                else
                {
                    var wrappedValidator = new DelegatingValidator(x => predicate((T)x), config.CurrentValidator);
                    config.ReplaceValidator(config.CurrentValidator, wrappedValidator);
                }
            }));
        }
        /// <summary>
        /// Applies the condition to the rule asynchronously
        /// </summary>
        /// <param name="predicate"></param>
        /// <param name="applyConditionTo"></param>
        public void ApplyAsyncCondition(Func <ValidationContext, CancellationToken, Task <bool> > predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators)
        {
            // Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain.
            if (applyConditionTo == ApplyConditionTo.AllValidators)
            {
                foreach (var validator in Validators.ToList())
                {
                    var wrappedValidator = new DelegatingValidator(predicate, validator);
                    ReplaceValidator(validator, wrappedValidator);
                }

                foreach (var dependentRule in DependentRules.ToList())
                {
                    dependentRule.ApplyAsyncCondition(predicate, applyConditionTo);
                }
            }
            else
            {
                var wrappedValidator = new DelegatingValidator(predicate, CurrentValidator);
                ReplaceValidator(CurrentValidator, wrappedValidator);
            }
        }