Quick Tip: Parse String to Nullable Value
When you’re dealing with a system like SharePoint that returns most
data as strings, it’s common to want to parse the data back into a
useful numeric format. The .NET framework offers several options to
achieve this, namely the static methods on System.Convert
and the static Parse()
methods on the various value types. However, these are limited in that they turn null
string values into the default for the given type (0, false, etc) and
they throw exceptions to indicate failure, which might be a performance
concern.
Often, a better option is to use the static TryParse()
method provided by most value types (with the notable exception of
enumerations). These follow the common pattern of returning a boolean
to indicate success and using an out
parameter to return the value. While much better suited for what we’re trying to achieve, the TryParse
pattern requires more plumbing than I care to see most of the time—I
just want the value. To that end, I put together a simple extension
method to encapsulate the pattern:
public delegate bool TryParser<T>(string value, out T result) where T : struct;
public static T? ParseWith<T>(this string value, TryParser<T> parser) where T : struct
{
T result;
if (parser(value, out result))
return result;
return null;
}
The struct
constraint on T
is required to align with the constraint on the Nullable<T>
returned by the method.
We can now greatly simplify our efforts to parse nullable values:
var myIntPropStr = properties.BeforeProperties["MyIntProp"] as string;
var myIntProp = myPropStr.ParseWith<int>(int.TryParse);
if(myIntProp == null)
throw new Exception("MyIntProp is empty!");
One quirk of this technique is that Visual Studio usually cannot infer T
from just the TryParse
method because of its multiple overloads. One option would be to write
a dedicated method for each value type, but I would view this as
unnecessary cluttering of the string
type. Your mileage may vary.