Я чувствовал, что должен поделиться своим, что более обобщенно.
Использование:
var result = "123".ParseBy(int.Parse);
var result2 = "123".ParseBy<int>(int.TryParse);
Решение:
public static class NullableParse
{
public static Nullable<T> ParseBy<T>(this string input, Func<string, T> parser)
where T : struct
{
try
{
return parser(input);
}
catch (Exception exc)
{
return null;
}
}
public delegate bool TryParseDelegate<T>(string input, out T result);
public static Nullable<T> ParseBy<T>(this string input, TryParseDelegate<T> parser)
where T : struct
{
T t;
if (parser(input, out t)) return t;
return null;
}
}
Первая версия медленнее, так как требует попытки, но выглядит чище. Если он не будет вызываться много раз с неверными строками, это не так важно.
Если производительность является проблемой, обратите внимание, что при использовании методов TryParse вам необходимо указать параметр типа ParseBy, так как он не может быть выведен компилятором. Мне также пришлось определить делегат, так как ключевое слово out нельзя использовать в Func <>, но по крайней мере на этот раз компилятору не требуется явный экземпляр.
Наконец, вы можете использовать его и с другими структурами, например, десятичными, DateTime, Guid и т. Д.