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