internal static T GetValueByIndex <T>(this IDataReader reader, IRecordWrapper wrapper, int index) { var isNull = reader.IsDBNull(index); var type = typeof(T); if (type.IsArray && type.GetElementType() == typeof(byte)) { return((T)(isNull ? new byte[0] : wrapper.GetValue(reader, index))); } try { return(GetValueFromReader <T>(isNull, reader, wrapper, index)); } catch { return(wrapper.GetValue(reader, index).To <T>()); } }
private static T GetValueFromReader <T>(bool isNull, IDataReader reader, IRecordWrapper wrapper, int index) { var typeCode = Type.GetTypeCode(typeof(T).GetNonNullableType()); switch (typeCode) { case TypeCode.Boolean: return((T)(object)(isNull ? new bool?() : wrapper.GetBoolean(reader, index))); case TypeCode.Char: return((T)(object)(isNull ? new char?() : wrapper.GetChar(reader, index))); case TypeCode.Byte: return((T)(object)(isNull ? new byte?() : wrapper.GetByte(reader, index))); case TypeCode.Int16: return((T)(object)(isNull ? new short?() : wrapper.GetInt16(reader, index))); case TypeCode.Int32: return((T)(object)(isNull ? new int?() : wrapper.GetInt32(reader, index))); case TypeCode.Int64: return((T)(object)(isNull ? new long?() : wrapper.GetInt64(reader, index))); case TypeCode.Decimal: return((T)(object)(isNull ? new decimal?() : wrapper.GetDecimal(reader, index))); case TypeCode.Double: return((T)(object)(isNull ? new double?() : wrapper.GetDouble(reader, index))); case TypeCode.String: return((T)(object)(isNull ? string.Empty : wrapper.GetString(reader, index))); case TypeCode.DateTime: return((T)(object)(isNull ? new DateTime?() : wrapper.GetDateTime(reader, index))); case TypeCode.Single: return((T)(object)(isNull ? new float?() : wrapper.GetFloat(reader, index))); default: return((T)wrapper.GetValue(reader, index)); } }