public static void ValidDataErrorInfo(object model, Type modelType, ModelValid modelValid, string modelName = "")
        {
            IDataErrorInfo dataErrorInfo = model as IDataErrorInfo;

            if (dataErrorInfo == null)
            {
                return;
            }

            foreach (var propertyName in modelType.GetProperties(
                         BindingFlags.GetProperty |
                         BindingFlags.SetProperty |
                         BindingFlags.Instance |
                         BindingFlags.Public)
                     .Select(x => x.Name))
            {
                var errorMessage = dataErrorInfo[propertyName];
                if (!String.IsNullOrWhiteSpace(errorMessage))
                {
                    modelValid.ValidResults.Add(new ValidFailure
                    {
                        ErrorMessage             = errorMessage,
                        ErrorMessageResourceName = propertyName,
                        Name = modelName + "." + propertyName
                    });
                }
            }
        }
        private static ModelValid GetModelValid(object model, Type modelType, string modelName)
        {
            var modelValid = new ModelValid();

            ValidValidAttribute(model != null ? new ValidationContext(model) : null, model, modelType, modelValid, modelName);
            ValidValidatableObject(model, modelType, modelValid, modelName);
            ValidDataErrorInfo(model, modelType, modelValid, modelName);

            return(modelValid);
        }
        private static void ValidValidatableObject(object model, Type modelType, ModelValid modelValid, string modelName)
        {
            IValidatableObject validatableObject = model as IValidatableObject;

            if (validatableObject == null)
            {
                return;
            }

            ValidationContext validationContext = new ValidationContext(model);

            foreach (var validResult in validatableObject.Validate(validationContext))
            {
                modelValid.ValidResults.Add(new ValidFailure()
                {
                    ErrorMessage = validResult.ErrorMessage,
                    MemberNames  = validResult.MemberNames,
                    Name         = modelName
                });
            }
        }
        private void ValidProperty(PropertyInfo property, object model, ModelValidDictionary modelValidDictionary, string modelName)
        {
            var propertyName = modelName + "." + property.Name;
            var validitions  = property.GetCustomAttributes <ValidationAttribute>();
            var modelValid   = new ModelValid();

            ValidValidAttribute(new ValidationContext(model), property.GetValue(model), validitions, modelValid, propertyName);

            if (modelValid != null &&
                modelValid.ValidResults != null &&
                modelValid.ValidResults.Any())
            {
                modelValidDictionary.Add(propertyName, modelValid);
            }

            ValidateModel(
                modelValidDictionary,
                model != null ? property.GetValue(model) : null,
                property.PropertyType,
                propertyName);
        }
        public override ModelValidDictionary Validate(object model, Type modelType, string modelName)
        {
            if (IsRequired == false)
            {
                return(null);
            }

            if (modelName == null)
            {
                modelName = "";
            }

            ModelValidDictionary modelValidDictionary = new ModelValidDictionary();

            if (modelType == null && model == null)
            {
                var validFailure = new ValidFailure()
                {
                    ErrorMessage = "model与modelType都为空"
                };

                var modelValid = new ModelValid();
                modelValid.ValidResults.Add(validFailure);

                modelValidDictionary.Add(modelName, modelValid);
                return(modelValidDictionary);
            }

            if (modelType == null && model != null)
            {
                modelType = model.GetType();
            }

            ValidateModel(modelValidDictionary, model, modelType, modelName);

            return(modelValidDictionary);
        }
        private static void ValidValidAttribute(ValidationContext validationContext, object model, IEnumerable <ValidationAttribute> validations, ModelValid modelValid, string modelName)
        {
            if (validations == null || !validations.Any())
            {
                return;
            }
            foreach (var validation in validations)
            {
                bool      result    = false;
                Exception exception = null;
                try
                {
                    if (validationContext == null)
                    {
                        result = validation.IsValid(model);
                    }
                    else
                    {
                        result = validation.GetValidationResult(model, validationContext) == ValidationResult.Success;
                    }
                }
                catch (Exception ex)
                {
                    exception = ex;
                }

                if (result)
                {
                    continue;
                }


                modelValid.ValidResults.Add(new ValidFailure()
                {
                    ErrorMessage             = validation.ErrorMessage ?? validation.ToString(),
                    ErrorMessageResourceName = validation.ErrorMessageResourceName,
                    ErrorMessageResourceType = validation.ErrorMessageResourceType,
                    ErrorMessageString       = validation.FormatErrorMessage(""),
                    Exception = exception,
                    Name      = modelName
                });
            }
        }
        private static void ValidValidAttribute(ValidationContext validationContext, object model, Type modelType, ModelValid modelValid, string modelName)
        {
            var validations = modelType.GetCustomAttributes <ValidationAttribute>();

            ValidValidAttribute(validationContext, model, validations, modelValid, modelName);
        }