Гленн Славен : мне больше интересно знать,
есть встроенный метод каркаса
который будет разбираться непосредственно в
обнуляемый int?
Существует такой подход, который непосредственно анализирует обнуляемое int (а не только int), если значение допустимо, например, пустая или пустая строка, но выдает исключение для недопустимых значений, поэтому вам нужно будет перехватить исключение и вернуть значение по умолчанию для этих ситуаций:
public static T Parse<T>(object value)
{
try { return (T)System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value.ToString()); }
catch { return default(T); }
}
Этот подход все еще может использоваться для не обнуляемых разборов, а также обнуляемых:
enum Fruit { Orange, Apple }
var res1 = Parse<Fruit>("Apple");
var res2 = Parse<Fruit?>("Banana");
var res3 = Parse<int?>("100") ?? 5; //use this for non-zero default
var res4 = Parse<Unit>("45%");
NB: В преобразователе есть метод IsValid, который можно использовать вместо захвата исключения (сгенерированные исключения приводят к ненужным издержкам , если ожидается). К сожалению, он работает только с .NET 4, но есть проблема, при которой он не проверяет ваш языковой стандарт при проверке правильных форматов DateTime, см. bug 93559 .