È anche possibile creare un metodo di estensione per questo scopo;
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;
}
}
Ho fatto questo un'estensione del tipo object
, ma si potrebbe anche su string
. Personalmente mi piace che queste estensioni parser siano disponibili su qualsiasi oggetto, quindi l'estensione su object
anziché string
.
Esempio di utilizzo:
[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));
}
Lo svantaggio è che questo rompe con la sintassi quadri per l'analisi dei valori;
int.TryParse(input, out output))
ma mi piace la versione più corta di esso (se è più leggibile o non potrebbe essere oggetto di discussione);
input.TryParse(out output)
fonte
2013-06-28 07:28:38
@JonSkeet - strValue cna essere nullo e il metodo Trim() genererebbe un'eccezione. Sto solo dicendo :) –
@ShaktiPrakashSingh: Non sappiamo se 'strValue' potrebbe essere nullo o no. Se proviene da una casella di testo, probabilmente * non può * essere nullo. Il mio codice non tenta di risolvere questo problema, ma non sappiamo davvero se * dovrebbe * affrontarlo o meno. –
perché non invertire il 'se'? es .: 'if (int.TryParse (Request [" idParent "], out tmp)) idParent = tmp;' (altrimenti è nullo) – Dementic