Ejemplo n.º 1
0
        /// <summary>
        /// 尝试将结果转换成目标类型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="result"></param>
        /// <returns></returns>
        private T TryConvertType <T>(object result)
        {
            // 取第一项
            object value;

            if (result is IList <object> rs)
            {
                value = rs.FirstOrDefault();
            }
            else
            {
                value = result;
            }

            // 转换字符串
            if (value is string str)
            {
                try
                {
                    switch (str)
                    {
                    case "OK": return((T)Commands.Ok);

                    case "PONG": return((T)Commands.Ok);
                    }
                    return(TypeConvert.C2Type <T>(str));
                }
                catch (Exception e)
                {
                    throw new RedisClientException($"将字符串({value})转为类型({typeof(T).Name})失败({e.Message})", MethodBase.GetCurrentMethod());
                }
            }

            // 转换字节
            if (value is byte[] byts)
            {
                try
                {
                    object   retVal;
                    TypeCode typeCode = Type.GetTypeCode(typeof(T));
                    switch (typeCode)
                    {
                    case TypeCode.Object: retVal = ObjectConvert.C2Obj <T>(byts); break;

                    case TypeCode.String: retVal = ObjectConvert.C2Str(byts); break;

                    case TypeCode.DateTime: retVal = ObjectConvert.C2Date(byts); break;

                    case TypeCode.Decimal: retVal = ObjectConvert.C2Dec(byts); break;

                    case TypeCode.Double: retVal = ObjectConvert.C2Dbl(byts); break;

                    case TypeCode.Single: retVal = ObjectConvert.C2Flt(byts); break;

                    case TypeCode.Int64: retVal = ObjectConvert.C2Lng(byts); break;

                    case TypeCode.Int32: retVal = ObjectConvert.C2Int(byts); break;

                    case TypeCode.Int16: retVal = ObjectConvert.C2Short(byts); break;

                    case TypeCode.UInt64: retVal = ObjectConvert.C2Lng(byts); break;

                    case TypeCode.UInt32: retVal = ObjectConvert.C2Int(byts); break;

                    case TypeCode.UInt16: retVal = ObjectConvert.C2Short(byts); break;

                    case TypeCode.Byte: retVal = ObjectConvert.C2Byte(byts); break;

                    case TypeCode.SByte: retVal = ObjectConvert.C2SByte(byts); break;

                    case TypeCode.Char: retVal = ObjectConvert.C2Chr(byts); break;

                    case TypeCode.Boolean: retVal = ObjectConvert.C2Bool(byts); break;

                    default: retVal = TypeConvert.C2Type <T>(byts); break;
                    }
                    return((T)retVal);
                }
                catch (Exception e)
                {
                    throw new RedisClientException($"将结果转换成类型({typeof(T).Name})失败({e.Message})", MethodBase.GetCurrentMethod());
                }
            }

            return(default);