Обобщения действительно полезны только тогда, когда вы знаете, какой тип будет во время компиляции, и в этом случае вы можете вызвать свой метод следующим образом:
GetValidatedValue<int>(dr[col].ToString());
Тем не менее, мне кажется, что вы на самом деле не знаете тип во время компиляции, поэтому генерики будут только мешать. Попробуйте реализовать неуниверсальную версию вашего метода, например:
public static object GetValidatedValue(string param, Type type)
{
return TryParse(param, type);
}
private static object TryParse(string inValue, Type type)
{
var converter = TypeDescriptor.GetConverter(type);
try
{
return converter.ConvertFromString(null, CultureInfo.InvariantCulture, inValue);
}
catch
{
return default(T);
}
}
Таким образом, вы можете назвать это так:
GetValidatedValue<int>(dr[col].ToString(), dr[col].GetType());
(Хотя я должен признать, что кажется ненужным перерабатывать что-то в строку, а затем снова преобразовывать ее в исходный тип.)
Обновление
Теперь, когда я лучше понимаю, что вы пытаетесь сделать, описанный выше метод не сработает, потому что dr[col]
не будет иметь любого типа, если он null
, и будет иметь DbNull
введите, если это DbNull
. Если у вас нет другого способа определить, какой тип данных должен храниться в этом столбце, он просто не будет работать. Конечно, если вы сможете выяснить, какой тип данных должен быть там, получить значение по умолчанию будет очень просто:
public static object GetValidatedValue(string param, Type type)
{
return param == null || param == DBNull.Value ? Activator.CreateInstance(type);
}