This question already has an answer here:
- Convert string to nullable type (int, double, etc…) 16 answers
- Generics and nullable type 7 answers
I have written overloaded static TryParse
methods for the following Nullable
types: int?
, short?
, long?
, double?
, DateTime?
, decimal?
, float?
, bool?
, byte?
and char?
. Below is some of the implementation:
protected static bool TryParse(string input, out int? value)
{
int outValue;
bool result = Int32.TryParse(input, out outValue);
value = outValue;
return result;
}
protected static bool TryParse(string input, out short? value)
{
short outValue;
bool result = Int16.TryParse(input, out outValue);
value = outValue;
return result;
}
protected static bool TryParse(string input, out long? value)
{
long outValue;
bool result = Int64.TryParse(input, out outValue);
value = outValue;
return result;
}
The logic is the same in every method except that they use different types. Would it not be possible to use generics so that I don't need to have so much redundant code? The signature would look like this:
bool TryParse<T>(string input, out T value);
Thanks
You could do it with reflection, but that would be relatively slow. Otherwise, you could create a map from type to "method to use for that type" but it would be pretty ugly. Aside from anything else, it would never be truly generic - it would only work for types that provided a
TryParse
method of the right signature, which couldn't be known at compile-time.I would personally consider changing the signature and behaviour, by the way. Currently even though the type of
value
is nullable, it will never have the null value at the end of the method, even if you returnfalse
. Why not make the return value the result of the parsing operation, returningnull
on failure?As an aside, you could refactor your code:
You could use the following generic extension method,
The following call will return the nullable parsed type.