Ответ 1
Это еще проще:
Type type = Type.GetType("System." + colType);
Если вы хотите преобразовать значение в этот тип, вы можете напрямую использовать typecode
Convert.ChangeType(value, colType);
В приведенном ниже коде я получаю 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]);
}
Это еще проще:
Type type = Type.GetType("System." + colType);
Если вы хотите преобразовать значение в этот тип, вы можете напрямую использовать typecode
Convert.ChangeType(value, colType);
Использование оператора 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;
}
Я не думаю, что в .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);
Точный ответ на вопрос в OP (с использованием подсказки schoetbi) будет:
public static Type GetType(TypeCode code)
{
return Type.GetType("System." + Enum.GetName(typeof(TypeCode), code));
}
Вот как мне это нравится. Я предпочитаю использовать статическую таблицу против большого переключателя или отражения для этого.
/// <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;
}