Я бы хотел ограничить значение числового параметра в конструкторе в определенном диапазоне.
Я знаю, что обычный способ - сделать что-то вроде следующего:
public class Foo
{
public int MaxAmount { get; }
public int Amount { get; set; }
public Foo(int amount)
{
if (amount > MaxAmount) { Amount = MaxAmount; }
else if (amount < 1) { Amount = 1; }
else { Amount = amount; }
}
}
Но что мне не нравится в этом, так это то, что вызывающая сторона не знает, когда для свойства установлено значение, отличное от указанного.Я мог бы вернуть исключение вместо того, чтобы молча фиксировать значение, но это не очень дружелюбно.
Что-то, что я хотел бы, - это что-то вроде этого:
public Foo(int(1, this.MaxAmount) amount) // Where int(minimumValue, maximumValue)
{
Amount = amount;
}
, в котором бы не былодаже быть в состоянии создать экземпляр Foo с недопустимым значением - фреймворк предотвратит это.
Возможно ли что-нибудь подобное?
РЕДАКТИРОВАТЬ ДЛЯ ЯРКОСТИ:
Что мне нужноэто средство, с помощью которого сам параметр может переносить и передавать информацию о своих ограничениях - «запеченным» способом, который, например, может появиться в Intellisense при написании вызова.Таким образом, я бы избегал попыток даже создать экземпляр класса, если значения параметров недопустимы.
Если, например, программа работает, а пользователь вводит число (N) инажимает кнопку, которая создает новый Foo с недопустимым количеством N, теперь у меня есть исключение для обработки и что-то для отладки и исправления.Зачем вообще это позволять?Если Foo был явно определен как имеющий верхнюю границу 4 для своего свойства Amount, какой смысл позволять разработчику писать Foo (5), когда я мог бы сообщить ему, что передаваемое им значение недопустимо в то время, когда оннаписал это?
Если есть какой-то синтаксический сахар, такой как ParameterConstraint или что-то еще, который обрабатывается платформой для меня, чтобы мне не приходилось сворачивать свои собственные в каждый класс, который я пишу, я думаю, что это будеточень полезно.