protected AsyncPropertyValidationBuilder <TObject, TProp> RuleFor <TProp>(Expression <Func <TObject, TProp> > expression)
        {
            var property          = ExtractProperty(expression);
            var propertyValidator = new AsyncPropertyValidator <TObject, TProp>(property);

            InnerPropertyValidators.Add(propertyValidator);

            return(new AsyncPropertyValidationBuilder <TObject, TProp>(propertyValidator));
        }
        public ValidationResult Validate(TObject objToValidate)
        {
            var propertyValidators = InnerPropertyValidators.Cast <ISyncPropertyValidator>();

            var propertyValidationErrors = propertyValidators.Select(propertyValidator =>
                                                                     propertyValidator.Validate(objToValidate)).ToList();

            return(new ValidationResult(propertyValidationErrors));
        }
        public async Task <ValidationResult> Validate(TObject objToValidate)
        {
            var propertyValidators = InnerPropertyValidators.Cast <IAsyncPropertyValidator>();

            var propertyValidationErrors = new List <PropertyValidationResult>();

            foreach (var asyncPropertyValidator in propertyValidators)
            {
                var propertyValidationResult = await asyncPropertyValidator.Validate(objToValidate);

                propertyValidationErrors.Add(propertyValidationResult);
            }

            return(new ValidationResult(propertyValidationErrors));
        }