diff --git a/Dapper/SqlMapper.cs b/Dapper/SqlMapper.cs index 52a3ae9b2ac0bb978e102ad8e2979a7148ff6916..4f9c18d5c5e84b567e1d5edb0b37585f0e16e309 100644 --- a/Dapper/SqlMapper.cs +++ b/Dapper/SqlMapper.cs @@ -375,24 +375,17 @@ private static CacheInfo GetCacheInfo(object param, Identity identity) private static Func GetDeserializer(Identity identity, IDataReader reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false) { - object oDeserializer; - // dynamic is passed in as Object ... by c# design - if (typeof(T) == typeof(object) || typeof(T) == typeof(FastExpando)) - { - oDeserializer = GetDynamicDeserializer(reader,startBound, length, returnNullIfFirstMissing); - } - else if (typeof(T).IsClass && typeof(T) != typeof(string)) + if (typeof (T) == typeof (object) || typeof (T) == typeof (FastExpando)) { - oDeserializer = GetClassDeserializer(reader, startBound, length, returnNullIfFirstMissing: returnNullIfFirstMissing); + return GetDynamicDeserializer(reader, startBound, length, returnNullIfFirstMissing); } - else + if (typeof (T).IsClass && typeof (T) != typeof (string)) { - oDeserializer = GetStructDeserializer(reader); + return GetClassDeserializer(reader, startBound, length, returnNullIfFirstMissing); } + return GetStructDeserializer(reader); - var deserializer = (Func)oDeserializer; - return deserializer; } private class FastExpando : DynamicObject @@ -401,9 +394,7 @@ private class FastExpando : DynamicObject public static FastExpando Attach(IDictionary data) { - FastExpando expando = new FastExpando(); - expando.data = data; - return expando; + return new FastExpando {data = data}; } public override bool TrySetMember(SetMemberBinder binder, object value) @@ -418,14 +409,14 @@ public override bool TryGetMember(GetMemberBinder binder, out object result) } } - private static object GetDynamicDeserializer(IDataRecord reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false) + private static Func GetDynamicDeserializer(IDataRecord reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false) { if (length == -1) { length = reader.FieldCount - startBound; } - Func rval = + return r => { IDictionary row = new Dictionary(length); @@ -436,13 +427,13 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound row[r.GetName(i)] = tmp; if (returnNullIfFirstMissing && i == startBound && tmp == null) { - return null; + return default(T); } } - return FastExpando.Attach(row); + //we know this is an object so it will not box + return (T)(object)FastExpando.Attach(row); }; - return rval; } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] [Obsolete("This method is for internal usage only", true)] @@ -640,11 +631,9 @@ private static int ExecuteCommand(IDbConnection cnn, IDbTransaction tranaction, } } - private static object GetStructDeserializer(IDataReader reader) + private static Func GetStructDeserializer(IDataReader reader) { - Func deserializer = null; - - deserializer = r => + return r => { var val = r.GetValue(0); if (val == DBNull.Value) @@ -653,7 +642,6 @@ private static object GetStructDeserializer(IDataReader reader) } return (T)val; }; - return deserializer; } public static Func GetClassDeserializer(IDataReader reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false)