оптимизировать целочисленную проверку

У меня есть несколько классов со свойствами, которые могут иметь только числовые значения в заданном диапазоне (например, от 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 ответ
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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *