У меня есть несколько классов со свойствами, которые могут иметь только числовые значения в заданном диапазоне (например, от 0 до 8). Это должно быть подтверждено, и неправильные значения должны быть исключены. Данное поведение может быть реализовано без дублирования данного кода.
Есть некоторые Атрибуты валидатора в C #, но я не могу заставить их работать. Похоже, они не предотвращают присвоение неправильных значений в нормальном классе.
Мое текущее решение — скопировать и вставить этот фрагмент для каждого атрибута. Но копипаст не идеален:
private short _index;
public short Index
{
get => this._index;
private set
{
const short min = 0;
const short max = 8;
if (value < min || max < value)
{
throw new ArgumentOutOfRangeException("The passed value is not between " + min + " and " + max + " (values included)");
}
this._index = value;
}
}
1 ответ
Чтобы уменьшить количество строк кода для копирования / вставки, вы можете создать вспомогательный метод:
public static class Helper
{
public static void EnsureIsInRange(short value, short min, short max)
{
if (value < min || max < value)
{
throw new ArgumentOutOfRangeException("The passed value is not between " + min + " and " + max + " (values included)");
}
}
}
или более общий:
public static class Helper
{
public static void EnsureIsInRange<T>(T value, T min, T max) where T : IComparable<T>
{
if (value.CompareTo(min) != 1 || value.CompareTo(max) != -1)
{
throw new ArgumentOutOfRangeException("The passed value is not between " + min + " and " + max + " (values included)");
}
}
}
// использование:
private short _index;
public short Index
{
get => this._index;
private set
{
Helper.EnsureIsInRange(value, 0, 8);
this._index = value;
}
}

Спасибо за помощь. Это то, что мне нужно.
— finder2