Me gustaría restringir el valor de un parámetro numérico en un constructor dentro de un cierto rango.Restringir el valor de un parámetro en un constructor AT TIEMPO DE DISEÑO
sé la forma convencional es hacer algo como lo siguiente:
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; }
}
}
Pero lo que no me gusta de esto es que la persona que llama no sabe cuando la propiedad se establece en algo distinto lo que se especificó. Podría devolver una excepción en lugar de silenciar el valor en silencio, pero eso no es muy amigable.
Lo que me gustaría es algo parecido a esto:
public Foo(int(1, this.MaxAmount) amount) // Where int(minimumValue, maximumValue)
{
Amount = amount;
}
en el que uno ni siquiera sería capaz de crear una instancia de Foo con un valor inaceptable - el marco lo impediría.
¿Es posible algo como esto?
EDITAR para mayor claridad:
lo que busco es un medio por el cual el parámetro en sí puede llevar y comunicar la información sobre sus limitaciones - en un 'cuece en' moda que podría, por ejemplo, superficie en Intellisense cuando escribió la llamada. Por lo tanto, evitaría el trabajo de intentar crear instancias de la clase si los valores de los parámetros no eran válidos.
Si, por ejemplo, el programa se está ejecutando y el usuario escribe un número (N) y presiona un botón que crea un nuevo Foo con una cantidad ilegal de N, ahora tengo una excepción y algo para depurar y fijar. ¿Por qué incluso permitirlo en primer lugar? Si Foo ha sido explícitamente definido como teniendo un límite superior de 4 para su propiedad Amount, ¿por qué permitir que el desarrollador escriba Foo (5) cuando pude haberle informado que el valor que está pasando no es válido en el momento en que él ¿lo escribió?
Si hay algo de azúcar sintáctica, como ParameterConstraint o algo así, eso es manejado por el Framework para que yo no tenga que aplicar el mío en todas las clases que escribo, creo que sería muy útil.
Tenga en cuenta que usar 'Contract.Requires' no es suficiente. Aún necesita un 'if (...) lanzar new ArgumentOutOfRangeException()'. –