protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            try
            {
                // Prevent infinite recursion by keeping track of what we've hit so far
                if (validationContext.Items.ContainsKey(value))
                {
                    return ValidationResult.Success;
                }
                validationContext.Items.Add(value, true);

                var outResults = new Collection<ValidationResult>();
                // Try validation again, but keep our Items list
                Validator.TryValidateObject(value, new ValidationContext(value, validationContext.Items),
                    outResults, validateAllProperties: true);

                if(outResults.Count > 0)
                {
                    var validationResult = new ValidationCumulativeResults(
                        string.Format("The field {0} in {1} is not valid.",
                            validationContext.MemberName,
                            validationContext.ObjectType.Name),
                        outResults);
                    return validationResult;
                }

                return ValidationResult.Success;
            }
            catch (ValidationException exception)
            {
                throw new ValidationException(string.Format("Invalid usage of ValidateObjectDeep on member '{0}' of '{1}'",
                    validationContext.MemberName, validationContext.ObjectType.FullName), exception);
            }
        }
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            try
            {
                // Prevent infinite recursion by keeping track of what we've hit so far
                if (validationContext.Items.ContainsKey(value))
                {
                    return(ValidationResult.Success);
                }
                validationContext.Items.Add(value, true);


                var outResults = new Collection <ValidationResult>();
                // Try validation again, but keep our Items list
                Validator.TryValidateObject(value, new ValidationContext(value, validationContext.Items),
                                            outResults, validateAllProperties: true);

                if (outResults.Count > 0)
                {
                    var validationResult = new ValidationCumulativeResults(
                        string.Format("The field {0} in {1} is not valid.",
                                      validationContext.MemberName,
                                      validationContext.ObjectType.Name),
                        outResults);
                    return(validationResult);
                }

                return(ValidationResult.Success);
            }
            catch (ValidationException exception)
            {
                throw new ValidationException(string.Format("Invalid usage of ValidateObjectDeep on member '{0}' of '{1}'",
                                                            validationContext.MemberName, validationContext.ObjectType.FullName), exception);
            }
        }