Как преобразовать TypeCode в фактический тип?

В приведенном ниже коде я получаю colType, который является номером кода для типа. Но как мне преобразовать это число в фактический тип? спасибо!!

for (int j = 0; j < dvColumns.Count; j++)
{
    // Get the name of the column.
    drvCols = dvColumns[j];
    colName = drvCols.Row.ItemArray[3].ToString();

    // Get columns data type code and save it off.
    colType = Convert.ToInt32(drvCols.Row.ItemArray[11]);
}

Ответы

Ответ 1

Это еще проще:

Type type = Type.GetType("System." + colType);

Если вы хотите преобразовать значение в этот тип, вы можете напрямую использовать typecode

Convert.ChangeType(value, colType);

Ответ 2

Использование оператора switch:

    public static Type ToType(this TypeCode code)
    {
        switch (code)
        {
            case TypeCode.Boolean:
                return typeof(bool);

            case TypeCode.Byte:
                return typeof(byte);

            case TypeCode.Char:
                return typeof(char);

            case TypeCode.DateTime:
                return typeof(DateTime);

            case TypeCode.DBNull:
                return typeof(DBNull);

            case TypeCode.Decimal:
                return typeof(decimal);

            case TypeCode.Double:
                return typeof(double);

            case TypeCode.Empty:
                return null;

            case TypeCode.Int16:
                return typeof(short);

            case TypeCode.Int32:
                return typeof(int);

            case TypeCode.Int64:
                return typeof(long);

            case TypeCode.Object:
                return typeof(object);

            case TypeCode.SByte:
                return typeof(sbyte);

            case TypeCode.Single:
                return typeof(Single);

            case TypeCode.String:
                return typeof(string);

            case TypeCode.UInt16:
                return typeof(UInt16);

            case TypeCode.UInt32:
                return typeof(UInt32);

            case TypeCode.UInt64:
                return typeof(UInt64);
        }

        return null;
    }

Ответ 3

Я не думаю, что в .NET Framework есть какой-то способ сделать это изначально, так как все примеры, которые я видел, используют большой оператор switch для обработки преобразования (например: здесь).

Однако, если вы пытаетесь получить этот тип в качестве промежуточного шага к преобразованию объекта в этот тип, вы всегда можете использовать Convert.ChangeType, который принимает параметр TypeCode как параметр.

double d = -1.234;
int i = (int)Convert.ChangeType(d, TypeCode.Int32);

К сожалению, не видя того, что вы пытаетесь сделать, я не могу сказать, было бы полезно использовать ChangeType или нет.

EDIT:

Чтобы преобразовать int в OleDbType, вы можете просто указать его:

int i = 72; //72 is the value for OleDbType.Guid
if(Enum.IsDefined(typeof(System.Data.OleDb.OleDbType), i))
{
    System.Data.OleDb.OleDbType dbType = (System.Data.OleDb.OleDbType)i;
    Console.WriteLine(dbType);
}
else
    Console.WriteLine("{0} is not defined for System.Data.OleDb.OleDbType", i);

Ответ 4

Точный ответ на вопрос в OP (с использованием подсказки schoetbi) будет:

public static Type GetType(TypeCode code)
    {         
        return Type.GetType("System." + Enum.GetName(typeof(TypeCode), code));
    }

Ответ 5

Вот как мне это нравится. Я предпочитаю использовать статическую таблицу против большого переключателя или отражения для этого.

/// <summary>
/// Table that maps TypeCode to it corresponding Type.
/// </summary>
static IReadOnlyDictionary<TypeCode, Type> TypeCodeToTypeMap = new Dictionary<TypeCode, Type>
{
    { TypeCode.Boolean, typeof(bool) },
    { TypeCode.Byte, typeof(byte) },
    { TypeCode.Char, typeof(char) },
    { TypeCode.DateTime, typeof(DateTime) },
    { TypeCode.DBNull, typeof(DBNull) },
    { TypeCode.Decimal, typeof(decimal) },
    { TypeCode.Double, typeof(double) },
    { TypeCode.Empty, null },
    { TypeCode.Int16, typeof(short) },
    { TypeCode.Int32, typeof(int) },
    { TypeCode.Int64, typeof(long) },
    { TypeCode.Object, typeof(object) },
    { TypeCode.SByte, typeof(sbyte) },
    { TypeCode.Single, typeof(Single) },
    { TypeCode.String, typeof(string) },
    { TypeCode.UInt16, typeof(UInt16) },
    { TypeCode.UInt32, typeof(UInt32) },
    { TypeCode.UInt64, typeof(UInt64) }
};

/// <summary>
/// Convert a TypeCode ordinal into it corresponding Type instance.
/// </summary>
public static Type ToType(this TypeCode code)
{
    Type type = null;

    TypeCodeToTypeMap.TryGetValue(code, out type);

    return type;
}