protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var param = new List <object> { value }; if (!string.IsNullOrWhiteSpace(ArgProperty)) { param.Add(ArgProperty == "this" ? validationContext.ObjectInstance : validationContext.ObjectInstance.GetType().GetProperty(ArgProperty)?.GetValue(validationContext.ObjectInstance)); } return((ValidationResult)ValidatorType.GetMethod(Method)?.Invoke(null, param.ToArray())); }
/// <summary> /// Запускает пользовательскую валидацию /// </summary> /// <param name="objectToValidate">объект для проверки</param> /// <param name="currentTarget">объект, на котором производится валидация</param> /// <param name="key">ключ, который идентифицирует источник <paramref name="objectToValidate"/></param> /// <param name="validationResults">результаты валидации</param> public override void DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults) { bool isValid; var messageTemplate = MessageTemplate; // Получаем информацию о методе и его параметрах var tempMethodInfo = ValidatorType.GetMethod(Method); var tempParametersInfo = tempMethodInfo.GetParameters(); // Заполняем массив типов параметров var parameterTypes = new Type[3]; parameterTypes[0] = tempParametersInfo[0].ParameterType; parameterTypes[1] = tempParametersInfo[1].ParameterType; parameterTypes[2] = Type.GetType("System.String&"); // Получаем информацию о методе var methodInfo = ValidatorType.GetMethod(Method, parameterTypes); // Заполняем массив фактических значений параметров var parameters = new object[3]; parameters[0] = Converter.ChangeType(objectToValidate, parameterTypes[0]); parameters[1] = Converter.ChangeType(currentTarget, parameterTypes[1]); parameters[2] = null; // Вызываем метод и получаем результат проверки if (methodInfo.IsStatic) { isValid = (bool)methodInfo.Invoke(ValidatorType, parameters); } else { // Создаем экземпляр объекта var validatorObject = Activator.CreateInstance(ValidatorType); isValid = (bool)methodInfo.Invoke(validatorObject, parameters); } if (isValid == Negated) { MessageTemplate = !string.IsNullOrWhiteSpace(parameters[2]?.ToString()) ? parameters[2].ToString() : messageTemplate; LogValidationResult( validationResults, string.Format(CultureInfo.CurrentCulture, MessageTemplate, objectToValidate, key, Tag, ValidatorType, Method), currentTarget, key ); } }
protected override ValidationResult IsValid(object value, ValidationContext validationContext) { object arg = null; if (ArgProperty == "this") { arg = validationContext.ObjectInstance; } else { arg = validationContext.ObjectInstance.GetType().GetProperty(ArgProperty)?.GetValue(validationContext.ObjectInstance); } return((ValidationResult)ValidatorType.GetMethod(Method)?.Invoke(null, new object[] { value, arg })); }