System.Data.Common.SqlConvert.ChangeType2 C# (CSharp) Метод

ChangeType2() публичный статический Метод

public static ChangeType2 ( object value, StorageType stype, Type type, IFormatProvider formatProvider ) : object
value object
stype StorageType
type Type
formatProvider IFormatProvider
Результат object
        public static object ChangeType2(object value, StorageType stype, Type type, IFormatProvider formatProvider)
        {
            switch (stype)
            { // if destination is SQL type
                case StorageType.SqlBinary:
                    return (SqlConvert.ConvertToSqlBinary(value));
                case StorageType.SqlBoolean:
                    return (SqlConvert.ConvertToSqlBoolean(value));
                case StorageType.SqlByte:
                    return (SqlConvert.ConvertToSqlByte(value));
                case StorageType.SqlBytes:
                    return (SqlConvert.ConvertToSqlBytes(value));
                case StorageType.SqlChars:
                    return (SqlConvert.ConvertToSqlChars(value));
                case StorageType.SqlDateTime:
                    return (SqlConvert.ConvertToSqlDateTime(value));
                case StorageType.SqlDecimal:
                    return (SqlConvert.ConvertToSqlDecimal(value));
                case StorageType.SqlDouble:
                    return (SqlConvert.ConvertToSqlDouble(value));
                case StorageType.SqlGuid:
                    return (SqlConvert.ConvertToSqlGuid(value));
                case StorageType.SqlInt16:
                    return (SqlConvert.ConvertToSqlInt16(value));
                case StorageType.SqlInt32:
                    return (SqlConvert.ConvertToSqlInt32(value));
                case StorageType.SqlInt64:
                    return (SqlConvert.ConvertToSqlInt64(value));
                case StorageType.SqlMoney:
                    return (SqlConvert.ConvertToSqlMoney(value));
                case StorageType.SqlSingle:
                    return (SqlConvert.ConvertToSqlSingle(value));
                case StorageType.SqlString:
                    return (SqlConvert.ConvertToSqlString(value));
                /*            case StorageType.SqlXml:
                                if (DataStorage.IsObjectNull(value)) {
                                    return SqlXml.Null;
                                }
                                goto default;
                */
                default: // destination is CLR
                    if ((DBNull.Value == value) || (null == value))
                    {
                        return DBNull.Value;
                    }
                    Type valueType = value.GetType();
                    StorageType vtype = DataStorage.GetStorageType(valueType);
                    // destination is CLR
                    switch (vtype)
                    {// and source is SQL type
                        case StorageType.SqlBinary:
                        case StorageType.SqlBoolean:
                        case StorageType.SqlByte:
                        case StorageType.SqlBytes:
                        case StorageType.SqlChars:
                        case StorageType.SqlDateTime:
                        case StorageType.SqlDecimal:
                        case StorageType.SqlDouble:
                        case StorageType.SqlGuid:
                        case StorageType.SqlInt16:
                        case StorageType.SqlInt32:
                        case StorageType.SqlInt64:
                        case StorageType.SqlMoney:
                        case StorageType.SqlSingle:
                        case StorageType.SqlString:
                            throw ExceptionBuilder.ConvertFailed(valueType, type);
                        default: // source is CLR type
                            if (StorageType.String == stype)
                            { // destination is string
                                switch (vtype)
                                { // source's  type
                                    case StorageType.Boolean:
                                        return ((IConvertible)(bool)value).ToString(formatProvider);
                                    case StorageType.Char:
                                        return ((IConvertible)(char)value).ToString(formatProvider);
                                    case StorageType.SByte:
                                        return ((sbyte)value).ToString(formatProvider);
                                    case StorageType.Byte:
                                        return ((byte)value).ToString(formatProvider);
                                    case StorageType.Int16:
                                        return ((short)value).ToString(formatProvider);
                                    case StorageType.UInt16:
                                        return ((ushort)value).ToString(formatProvider);
                                    case StorageType.Int32:
                                        return ((int)value).ToString(formatProvider);
                                    case StorageType.UInt32:
                                        return ((uint)value).ToString(formatProvider);
                                    case StorageType.Int64:
                                        return ((long)value).ToString(formatProvider);
                                    case StorageType.UInt64:
                                        return ((ulong)value).ToString(formatProvider);
                                    case StorageType.Single:
                                        return ((float)value).ToString(formatProvider);
                                    case StorageType.Double:
                                        return ((double)value).ToString(formatProvider);
                                    case StorageType.Decimal:
                                        return ((decimal)value).ToString(formatProvider);
                                    case StorageType.DateTime:
                                        return ((DateTime)value).ToString(formatProvider);
                                    //return  XmlConvert.ToString((DateTime) value, XmlDateTimeSerializationMode.RoundtripKind);
                                    case StorageType.TimeSpan:
                                        return XmlConvert.ToString((TimeSpan)value);
                                    case StorageType.Guid:
                                        return XmlConvert.ToString((Guid)value);
                                    case StorageType.String:
                                        return (string)value;
                                    case StorageType.CharArray:
                                        return new string((char[])value);
                                    case StorageType.DateTimeOffset:
                                        return ((DateTimeOffset)value).ToString(formatProvider);
                                    case StorageType.BigInteger:
                                        break;
                                    default:
                                        IConvertible iconvertible = (value as IConvertible);
                                        if (null != iconvertible)
                                        {
                                            return iconvertible.ToString(formatProvider);
                                        }
                                        // catch additional classes like Guid
                                        IFormattable iformattable = (value as IFormattable);
                                        if (null != iformattable)
                                        {
                                            return iformattable.ToString(null, formatProvider);
                                        }
                                        return value.ToString();
                                }
                            }
                            else if (StorageType.TimeSpan == stype)
                            {
                                // destination is TimeSpan
                                switch (vtype)
                                {
                                    case StorageType.String:
                                        return XmlConvert.ToTimeSpan((string)value);
                                    case StorageType.Int32:
                                        return new TimeSpan((int)value);
                                    case StorageType.Int64:
                                        return new TimeSpan((long)value);
                                    default:
                                        return (TimeSpan)value;
                                }
                            }
                            else if (StorageType.DateTimeOffset == stype)
                            { // destination is DateTimeOffset
                                return (DateTimeOffset)value;
                            }
                            else if (StorageType.String == vtype)
                            { // if source is string
                                switch (stype)
                                { // type of destination
                                    case StorageType.String:
                                        return (string)value;
                                    case StorageType.Boolean:
                                        if ("1" == (string)value) return true;
                                        if ("0" == (string)value) return false;
                                        break;
                                    case StorageType.Char:
                                        return ((IConvertible)(string)value).ToChar(formatProvider);
                                    case StorageType.SByte:
                                        return ((IConvertible)(string)value).ToSByte(formatProvider);
                                    case StorageType.Byte:
                                        return ((IConvertible)(string)value).ToByte(formatProvider);
                                    case StorageType.Int16:
                                        return ((IConvertible)(string)value).ToInt16(formatProvider);
                                    case StorageType.UInt16:
                                        return ((IConvertible)(string)value).ToUInt16(formatProvider);
                                    case StorageType.Int32:
                                        return ((IConvertible)(string)value).ToInt32(formatProvider);
                                    case StorageType.UInt32:
                                        return ((IConvertible)(string)value).ToUInt32(formatProvider);
                                    case StorageType.Int64:
                                        return ((IConvertible)(string)value).ToInt64(formatProvider);
                                    case StorageType.UInt64:
                                        return ((IConvertible)(string)value).ToUInt64(formatProvider);
                                    case StorageType.Single:
                                        return ((IConvertible)(string)value).ToSingle(formatProvider);
                                    case StorageType.Double:
                                        return ((IConvertible)(string)value).ToDouble(formatProvider);
                                    case StorageType.Decimal:
                                        return ((IConvertible)(string)value).ToDecimal(formatProvider);
                                    case StorageType.DateTime:
                                        return ((IConvertible)(string)value).ToDateTime(formatProvider);
                                    //return  XmlConvert.ToDateTime((string) value, XmlDateTimeSerializationMode.RoundtripKind);
                                    case StorageType.TimeSpan:
                                        return XmlConvert.ToTimeSpan((string)value);
                                    case StorageType.Guid:
                                        return XmlConvert.ToGuid((string)value);
                                    case StorageType.Uri:
                                        return new Uri((string)value);
                                    default: // other clr types,
                                        break;
                                }
                            }
                            return Convert.ChangeType(value, type, formatProvider);
                    }
            }
        }