C # добавить проверку на метод сеттера - PullRequest
8 голосов
/ 25 мая 2011

У меня есть пара переменных, которые я определяю в C #:

public String firstName { get; set; }
public String lastName { get; set; }
public String organization { get; set; }

Что я хочу, так это добавить проверку к этим методам, когда вы пытаетесь установить значение. Допустим, вы собираетесь установить значение для firstName, и я должен передать это регулярное выражение, чтобы установить его в действительности, в противном случае должно быть сгенерировано исключение. Можно ли построить с этим "коротким синтаксисом" или я должен пойти на стандартные (как в JAVA) методы получения и установки и там проверить данные?

Ответы [ 4 ]

25 голосов
/ 25 мая 2011

Если вы хотите проверить, когда свойство установлено, вам нужно использовать неавтоматические свойства (то есть, определенные вручную get и set методы).

Но другой способ проверки состоит в том, чтобы иметь логику проверки отдельно от объекта домена.

class Customer {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Organization { get; set; }
}

interface IValidator<T> {
    bool Validate(T t);
}

class CustomerValidator : IValidator<Customer> {
    public bool Validate(Customer t) {
        // validation logic
    }
}

Тогда вы могли бы сказать:

Customer customer = // populate customer
var validator = new CustomerValidator();
if(!validator.Validate(customer)) {
    // head splode
}

Я предпочитаю такой подход:

  1. A Customer не должен нести ответственность за проверку своих данных, что является еще одной обязанностью и, следовательно, должно жить в другом месте.
  2. В разных ситуациях требуется разная логика проверки для одного и того же объекта домена.
9 голосов
/ 25 мая 2011

То, что у вас сейчас есть, называется «авто-свойствами» и выполняет только простое «получить / установить». Чтобы настроить поведение get или set, вам необходимо преобразовать свойства в свойства на основе поля:

private string _firstName;
public string FirstName 
{ 
    get {return _firstName;} 
    set 
    {
       Validate(value); _firstName = value;
    }
}

Обратите внимание, что я изменил String на string и прописал в заглавии имя свойства, следуя принятым рекомендациям по именованию C #.

3 голосов
/ 25 мая 2011

Я бы вообще не добавил валидацию в setter. Скорее я бы создал функцию с именем validate вместо этого ... таким образом, весь ваш проверочный код находится в одном месте, а не по всей вашей setters.

0 голосов
/ 25 мая 2011

Для этого вы должны использовать полный синтаксис свойства.

...