Использование IValidatableObject для проверки, установлен ли хотя бы один параметр

#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");  }  } }