在下面的代码中,我得到colType
,这是该类型的代码。但是,我如何将该数字转换为实际类型? THX !!
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]);
}
答案 0 :(得分:19)
它更简单:
Type type = Type.GetType("System." + colType);
如果要将值转换为该类型,可以直接使用typecode
Convert.ChangeType(value, colType);
答案 1 :(得分:11)
使用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;
}
答案 2 :(得分:3)
我认为在.NET Framework中没有任何方法可以本地执行此操作,因为我看到的所有示例都使用了大的switch语句来处理转换(例如:here)。
但是,如果您尝试将该类型作为将对象转换为该类型的中间步骤,则可以始终使用Convert.ChangeType接受TypeCode
作为参数。
double d = -1.234;
int i = (int)Convert.ChangeType(d, TypeCode.Int32);
不幸的是,如果没有看到你想要做什么,我真的不能说ChangeType
是否会有所帮助。
编辑:
要将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);
答案 3 :(得分:3)
OP中问题的确切答案(使用 schoetbi的提示)将是:
{{1}}
答案 4 :(得分:2)
这是我喜欢做的事情。我更喜欢使用静态表而不是大开关或反射。
/// <summary>
/// Table that maps TypeCode to it's 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's corresponding Type instance.
/// </summary>
public static Type ToType(this TypeCode code)
{
Type type = null;
TypeCodeToTypeMap.TryGetValue(code, out type);
return type;
}