54 lines
1.7 KiB
C#
54 lines
1.7 KiB
C#
namespace ArgumentsToolkit;
|
|
|
|
/// <summary>
|
|
/// Атрибут для проверки строкового значения на соответствие списку допустимых значений.
|
|
/// </summary>
|
|
[AttributeUsage(AttributeTargets.Property)]
|
|
public class AllowedValuesAttribute : ValidationAttribute
|
|
{
|
|
/// <summary>
|
|
/// Список допустимых значений.
|
|
/// </summary>
|
|
public string[] Values { get; }
|
|
|
|
/// <summary>
|
|
/// Создаёт новый атрибут допустимых значений.
|
|
/// </summary>
|
|
/// <param name="values">Массив допустимых строковых значений.</param>
|
|
public AllowedValuesAttribute(params string[] values)
|
|
{
|
|
Values = values;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Создаёт новый атрибут допустимых значений.
|
|
/// </summary>
|
|
/// <param name="en">Enum допустимых значений.</param>
|
|
public AllowedValuesAttribute(Enum en)
|
|
{
|
|
var enums = Enum.GetValues(en.GetType());
|
|
List<string> values = new();
|
|
|
|
foreach (var e in enums)
|
|
{
|
|
values.Add(e.ToString());
|
|
}
|
|
|
|
Values = values.ToArray();
|
|
}
|
|
|
|
public override string ErrorTemplate { get; set; } = "--{0}: значение {1} не входит в диапазон [{2}]";
|
|
|
|
public override bool Validate(object? value)
|
|
{
|
|
if (value is string s)
|
|
return Values.Contains(s);
|
|
return true;
|
|
}
|
|
|
|
public override string GetErrorMessage(string optionName, object? value)
|
|
{
|
|
return string.Format(ErrorTemplate, optionName, value, string.Join(", ", Values));
|
|
}
|
|
}
|