You can't convert a boxed decimal to a double; you have to cast it to an unboxed decimal first. You can use the Convert class to do what you're trying to do:
public static T Get<T>(this SqlDataReader reader, string field)
{
try {
int index = reader.GetOrdinal(field);
if (reader.IsDBNull(index)) return default(T);
object item = reader[index];
return item is T ? (T)item : (T)Convert.ChangeType(item, typeof(T));
} catch (Exception e) {
Console.WriteLine(e);
return default(T);
}
}
I'm sure there are some cases this doesn't handle, but it should be enough to get you started.