提交 8ecd21cf 编写于 作者: S simon.cropp

avoid some casting by more use of generics

上级 c17a5454
...@@ -375,24 +375,17 @@ private static CacheInfo GetCacheInfo(object param, Identity identity) ...@@ -375,24 +375,17 @@ private static CacheInfo GetCacheInfo(object param, Identity identity)
private static Func<IDataReader, T> GetDeserializer<T>(Identity identity, IDataReader reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false) private static Func<IDataReader, T> GetDeserializer<T>(Identity identity, IDataReader reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false)
{ {
object oDeserializer;
// dynamic is passed in as Object ... by c# design // dynamic is passed in as Object ... by c# design
if (typeof(T) == typeof(object) || typeof(T) == typeof(FastExpando)) if (typeof (T) == typeof (object) || typeof (T) == typeof (FastExpando))
{
oDeserializer = GetDynamicDeserializer(reader,startBound, length, returnNullIfFirstMissing);
}
else if (typeof(T).IsClass && typeof(T) != typeof(string))
{ {
oDeserializer = GetClassDeserializer<T>(reader, startBound, length, returnNullIfFirstMissing: returnNullIfFirstMissing); return GetDynamicDeserializer<T>(reader, startBound, length, returnNullIfFirstMissing);
} }
else if (typeof (T).IsClass && typeof (T) != typeof (string))
{ {
oDeserializer = GetStructDeserializer<T>(reader); return GetClassDeserializer<T>(reader, startBound, length, returnNullIfFirstMissing);
} }
return GetStructDeserializer<T>(reader);
var deserializer = (Func<IDataReader, T>)oDeserializer;
return deserializer;
} }
private class FastExpando : DynamicObject private class FastExpando : DynamicObject
...@@ -401,9 +394,7 @@ private class FastExpando : DynamicObject ...@@ -401,9 +394,7 @@ private class FastExpando : DynamicObject
public static FastExpando Attach(IDictionary<string, object> data) public static FastExpando Attach(IDictionary<string, object> data)
{ {
FastExpando expando = new FastExpando(); return new FastExpando {data = data};
expando.data = data;
return expando;
} }
public override bool TrySetMember(SetMemberBinder binder, object value) public override bool TrySetMember(SetMemberBinder binder, object value)
...@@ -418,14 +409,14 @@ public override bool TryGetMember(GetMemberBinder binder, out object result) ...@@ -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<IDataReader, T> GetDynamicDeserializer<T>(IDataRecord reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false)
{ {
if (length == -1) if (length == -1)
{ {
length = reader.FieldCount - startBound; length = reader.FieldCount - startBound;
} }
Func<IDataReader, FastExpando> rval = return
r => r =>
{ {
IDictionary<string, object> row = new Dictionary<string,object>(length); IDictionary<string, object> row = new Dictionary<string,object>(length);
...@@ -436,13 +427,13 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound ...@@ -436,13 +427,13 @@ private static object GetDynamicDeserializer(IDataRecord reader, int startBound
row[r.GetName(i)] = tmp; row[r.GetName(i)] = tmp;
if (returnNullIfFirstMissing && i == startBound && tmp == null) 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)] [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("This method is for internal usage only", true)] [Obsolete("This method is for internal usage only", true)]
...@@ -640,11 +631,9 @@ private static int ExecuteCommand(IDbConnection cnn, IDbTransaction tranaction, ...@@ -640,11 +631,9 @@ private static int ExecuteCommand(IDbConnection cnn, IDbTransaction tranaction,
} }
} }
private static object GetStructDeserializer<T>(IDataReader reader) private static Func<IDataReader, T> GetStructDeserializer<T>(IDataReader reader)
{ {
Func<IDataReader, T> deserializer = null; return r =>
deserializer = r =>
{ {
var val = r.GetValue(0); var val = r.GetValue(0);
if (val == DBNull.Value) if (val == DBNull.Value)
...@@ -653,7 +642,6 @@ private static object GetStructDeserializer<T>(IDataReader reader) ...@@ -653,7 +642,6 @@ private static object GetStructDeserializer<T>(IDataReader reader)
} }
return (T)val; return (T)val;
}; };
return deserializer;
} }
public static Func<IDataReader, T> GetClassDeserializer<T>(IDataReader reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false) public static Func<IDataReader, T> GetClassDeserializer<T>(IDataReader reader, int startBound = 0, int length = -1, bool returnNullIfFirstMissing = false)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册