adressmoeistranici
@adressmoeistranici
Делатель

Ошибка при самовалидации структуры?

Делаю самовалидацию структуры и натыкаюсь на ошибку
DataAnnotations ArgumentException Предоставленный экземпляр должен соответствовать ObjectInstance в предоставленном ValidationContext.
реализация интерфейса есть, а как именно ее использовать?
чтоб полей структуры атрибуты можно было чекать автоматом
public struct TableData : IValidatableObject
    {
        public string description;
        public string[] words;
        public string GetIndexedWords(int i, int j)
        {
            return words[i * 10 + j];
        }
        public void SetIndexedWords(string word, int i, int j)
        {
            words[i * 10 + j] = word;
        }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            ValidationResult error = null;
            if (String.IsNullOrWhiteSpace(description))
            {
                error = new ValidationResult("Поле description не инициализировано или является пустой строкой");
                goto TORETURN;
            }
            if (words == null || words.Length != 100)
            {
                error = new ValidationResult("Поле words не инициализировано или не имеет длинну 100");
                goto TORETURN;
            }
            for (int i = 0; i < 100; i++)
            {
                if (String.IsNullOrWhiteSpace(words[i]))
                {
                    error = new ValidationResult($"Элемент words[{i}] не инициализирован или является пустой строкой");
                    goto TORETURN;
                }
            }
            TORETURN:
            return new List<ValidationResult>() { error };
        }
    }
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
hePPer
@hePPer
мб потому что у вас структура?
она копируется - поэтому исходный экземпляр не соответствует захваченному в валидационном контексте

public static bool TryValidateObject(object instance, ValidationContext validationContext, ICollection<ValidationResult> validationResults, bool validateAllProperties) {
            if (instance == null) {
                throw new ArgumentNullException("instance");
            }
 
            if (validationContext != null && instance != validationContext.ObjectInstance) {
                throw new ArgumentException(Resources.DataAnnotationsResources.Validator_InstanceMustMatchValidationContextInstance, "instance");
            }
 
            bool result = true;
            bool breakOnFirstError = (validationResults == null);
 
            foreach (ValidationError err in GetObjectValidationErrors(instance, validationContext, validateAllProperties, breakOnFirstError)) {
                result = false;
 
                if (validationResults != null) {
                    validationResults.Add(err.ValidationResult);
                }
            }
 
            return result;
        }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы