Вот предложение для реализации, следуя логике Роберта Вагнера, но используя общий подход для уменьшения дублирования:
public static int ParseInt32(this NameValueCollection col, string key)
{
return Parse(col, key, int.Parse);
}
public static double ParseDouble(this NameValueCollection col, string key)
{
return Parse(col, key, double.Parse);
}
private static T Parse<T>(NameValueCollection col, string key, Func<string, T> parse)
{
string value = col[key];
if (string.IsNullOrEmpty(value))
return default(T);
return parse(value);
}
По правде говоря, возвращение нуля для нулевой или пустой строки пугает меня; это может вызвать проблемы, если некоторые значения законно равны нулю. Вместо этого я хотел бы, чтобы методы возвращали nullables (int?
, double?
и т. Д.), Что является несколько более компактным подходом, чем шаблон out-параметра, используемый для каркасных методов TryParse
. Вы можете сделать это:
public static int? ParseInt32(this NameValueCollection col, string key)
{
return Parse(col, key, int.Parse);
}
public static double? ParseDouble(this NameValueCollection col, string key)
{
return Parse(col, key, double.Parse);
}
private static T? Parse<T>(NameValueCollection col, string key, Func<string, T> parse)
where T : struct
{
string value = col[key];
if (string.IsNullOrEmpty(value))
return default(T?);
return parse(value);
}
Но это все равно вызовет исключение для непустых или пустых строк, которые не являются числовыми. Лучше использовать TryParse. Встроенные делегаты Func не поддерживают параметры ref или out, поэтому вам придется объявить свой собственный тип делегата, но это довольно тривиально.