Vorrei limitare il valore di un parametro numerico in un costruttore all'interno di un determinato intervallo.Limitare il valore di un parametro in un costruttore AT DESIGN TIME
So che il modo convenzionale è quello di fare qualcosa di simile al seguente:
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; }
}
}
Ma quello che non mi piace di questo è che il chiamante non sa quando la proprietà viene impostata su un valore diverso cosa è stato specificato Potrei restituire un'eccezione invece di bloccare silenziosamente il valore, ma non è molto amichevole.
Quello che mi piacerebbe è qualcosa di simile a questo:
public Foo(int(1, this.MaxAmount) amount) // Where int(minimumValue, maximumValue)
{
Amount = amount;
}
in cui non si sarebbe nemmeno in grado di istanziare Foo con un valore inaccettabile - il quadro sarebbe impedirlo.
È possibile qualcosa di simile?
EDIT PER CHIAREZZA:
quello che sto cercando è un mezzo attraverso il quale il parametro sé può trasportare e comunicare le informazioni sui suoi vincoli - in un 'cotto in' modo che potrebbe, ad esempio, superficie in Intellisense quando hai scritto la chiamata. Quindi, eviterei il tentativo di istanziare la classe anche se i valori per i parametri non erano validi.
Se, ad esempio, il programma è in esecuzione e l'utente digita un numero (N) e preme un pulsante che crea un nuovo Foo con una quantità non valida di N, ora ho un'eccezione da gestire e qualcosa da eseguire il debug e risolvere. Perché persino permetterlo in primo luogo? Se Foo è stato definito esplicitamente come avente un limite superiore di 4 per la sua proprietà Amount, qual è il punto di permettere allo sviluppatore di scrivere Foo (5) quando potrei averlo informato che il valore che sta passando non è valido nel momento in cui lui Scritto?
Se c'è dello zucchero sintattico, come ParameterConstraint o qualcosa del genere, che è gestito dal Framework per me, così che non devo girare il mio in ogni classe che scrivo, penso che sarebbe molto utile.
Si noti che l'uso di 'Contract.Requires' non è sufficiente. Hai ancora bisogno di un 'se (...) lanciare una nuova ArgumentOutOfRangeException()'. –