using System.Reflection; namespace ArgumentsToolkit; /// /// Класс для выполнения валидации модели Options на основе атрибутов. /// public static class Validator { /// /// Проверяет объект на соответствие правилам валидации. /// /// Тип модели опций. /// Экземпляр модели опций. /// Список ошибок валидации. /// true, если ошибок нет; иначе false. public static bool Validate(T options, out string[] errors) { var list = new List(); var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var p in props) { // Проверяем только свойства с [Option] var optionAttr = p.GetCustomAttribute(); if (optionAttr == null) continue; var val = p.GetValue(options); // Берём все атрибуты, которые реализуют IValidationAttribute foreach (var attr in p.GetCustomAttributes().OfType()) { if (!attr.Validate(val)) { var error = attr.GetErrorMessage(optionAttr.Name, val); list.Add(error); } } } errors = list.ToArray(); return list.Count == 0; } }