Добавьте файлы проекта.

This commit is contained in:
2025-11-27 09:10:58 +03:00
parent 730fd30d87
commit c1f50fcca0
32 changed files with 1154 additions and 0 deletions

View File

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