C# добавить проверку на метод setter

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

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

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

4 ответов


если вы хотите проверить, когда свойство установлено, вам нужно использовать неавтоматические свойства (т. е. вручную определенные 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. различные ситуации требуют различной логики проверки для одного и того же объекта домена.

то, что у вас есть сейчас, называется "auto-properties" и выполняет только простое "get/set". Для того, чтобы настроить поведение get или set, вам нужно будет преобразовать свойства в свойства, поддерживаемые полем:

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

обратите внимание, что я изменил String to string и заглавными буквами имя свойства, в соответствии с принятыми c# именования лучших практик.


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


для этого необходимо использовать полный синтаксис свойств.