#c# #asp.net-mvc #asp.net-core
#c# #asp.net-mvc #asp.сетевое ядро
Вопрос:
У меня есть UpdateAccountRequest
объект, представляющий PUT
тело запроса на обновление существующего Account
объекта. В настоящее время единственным свойством, которое может быть обновлено с помощью этой конечной точки, является Disabled
свойство. Чтобы убедиться, что вызывающий абонент не отправил пустой UpdateAccountRequest
запрос, я использую IValidateObject
интерфейс следующим образом:
public class UpdateAccountRequest: IValidatableObject { public bool? Disabled { get; set; } public IEnumerablelt;ValidationResultgt; Validate(ValidationContext validationContext) { if (!Disabled.HasValue) { yield return new ValidationResult("Disabled must be set"); } } }
Однако в будущем я планирую добавить в этот класс дополнительные свойства и хочу создать универсальный метод для проверки того, что вызывающий объект указал хотя бы одно свойство обновления. Я могу использовать отражение для достижения этой цели, просмотрев все свойства экземпляра, проверив их тип и посмотрев, не являются ли они нулевыми, но мне было интересно, есть ли что-то в структуре для достижения этой цели.
Ответ №1:
Поэтому я придумал что-то вроде этого. Не самое мое гордое творение, но, похоже, оно работает. Не уверен, что фреймворк поддерживает что-то подобное из коробки.
public class UpdateAccountRequest: IValidatableObject { public bool? Disabled { get; set; } public IEnumerablelt;ValidationResultgt; Validate(ValidationContext validationContext) { var satisfiedMembers = this.GetType().GetProperties() .Select(prop =gt; prop.GetValue(this, null)) .Where(val =gt; val != null); if (!satisfiedMembers.Any()) { yield return new ValidationResult("At-least one update parameter must be supplied"); } } }