Проверка полей класса C # с использованием пользовательских атрибутов - PullRequest
1 голос
/ 23 августа 2010
class Employee
{
  [ValueNotEmpty("Empty strings not allowed"]
  public string Name{get;set;}
}

"ValueNotEmpty" - это пользовательский атрибут. Я пытался использовать библиотеку YABOV, но мне пришлось явно вызвать метод Validate базового класса, чтобы проверить пользовательские атрибуты и вернуть сообщения проверки.

В классе реализации я использую отражение для установки значений в поле "Name". Когда я устанавливаю значение в поле "Name", я ожидаю, что блок try выдаст исключение, говорящее "Empty strings not allowed". Есть ли способ, которым я могу сделать это без явного вызова метода для проверки класса, когда я устанавливаю значение для поля?.

Ответы [ 2 ]

0 голосов
/ 23 августа 2010

Несколько мыслей по этой проблеме:

Если ваше свойство вызывает событие PropertyChanged, возможно, существует механизм, который использует это для его проверки. Например, в сочетании с привязкой данных. Если у вас нет PropertyChanged, вам нужно явно вызвать Validate где-нибудь, если только вы не используете AOP.

Выполнение кода, когда вы просто устанавливаете значение, потребует AOP. В стандартные библиотеки .Net не включена технология AOP, вам придется интегрировать ее (например, Spring). AOP требует генерации кода или улучшения байт-кода. Так что это не тривиальная вещь.

0 голосов
/ 23 августа 2010

Вы можете попробовать наследовать от IDataErrorInfo и реализации, как показано ниже, но я полагаю, что это то, что вы имеете в виду, явно вызывая проверку.

public class Employee : IDataErrorInfo
{
  public string Name{get;set;}

  string IDataErrorInfo.Error {get {return null;}}

  string IDataErrorInfo.this[string propertyName]
  {
    get { return this.GetValidationError(propertyName);}
  }

  string GetValidationError(string propertyName)
  {
    string error = null;
    switch(propertyName)
    {
      case "Name":
        error = ValidateName();
        break;
     default:
        error = "Unknown proeprty";
        break;
    }
  }

  string ValidateName()
  {
    if(!string.IsNullOrEmpty(this.Name))
    {
      return null;
    }
    return "Empty Name";
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...