Vous pouvez également fabriquer une méthode d'extension à cette fin ;
public static bool TryParse(this object value, out int? parsed)
{
parsed = null;
try
{
if (value == null)
return true;
int parsedValue;
parsed = int.TryParse(value.ToString(), out parsedValue) ? (int?)parsedValue : null;
return true;
}
catch (Exception)
{
return false;
}
}
J'en ai fait une extension sur le object
mais il pourrait tout aussi bien être sur string
. Personnellement, j'aime que ces extensions d'analyseur soient disponibles sur n'importe quel objet, d'où l'extension sur object
au lieu de string
.
Exemple d'utilisation :
[TestCase("1", 1)]
[TestCase("0", 0)]
[TestCase("-1", -1)]
[TestCase("2147483647", int.MaxValue)]
[TestCase("2147483648", null)]
[TestCase("-2147483648", int.MinValue)]
[TestCase("-2147483649", null)]
[TestCase("1.2", null)]
[TestCase("1 1", null)]
[TestCase("", null)]
[TestCase(null, null)]
[TestCase("not an int value", null)]
public void Should_parse_input_as_nullable_int(object input, int? expectedResult)
{
int? parsedValue;
bool parsingWasSuccessfull = input.TryParse(out parsedValue);
Assert.That(parsingWasSuccessfull);
Assert.That(parsedValue, Is.EqualTo(expectedResult));
}
L'inconvénient est que cela rompt avec la syntaxe des frameworks pour l'analyse des valeurs ;
int.TryParse(input, out output))
Mais j'aime bien la version abrégée (que ce soit plus lisible ou non peut être sujet à discussion) ;
input.TryParse(out output)