【发布时间】:2010-06-22 21:59:11
【问题描述】:
我需要根据 DataTable 中 DataColumns 的类型来格式化输出。
具体来说,我需要将内置的原始类型(int、string、decimal、DateTime 等)映射到:
- SomeEnum.Numeric
- SomeEnum.Bool
- SomeEnum.DateTime
- SomeEnum.String
- SomeEnum.Unknown
- SomeEnum.Null
我该怎么做?
【问题讨论】:
我需要根据 DataTable 中 DataColumns 的类型来格式化输出。
具体来说,我需要将内置的原始类型(int、string、decimal、DateTime 等)映射到:
我该怎么做?
【问题讨论】:
如果内置的TypeCode 枚举满足您的需求,那么您可以读取DataColumn 的DataType 属性,然后调用GetTypeCode,
TypeCode yourTypeCode = Type.GetTypeCode(yourDataColumn.DataType);
switch (yourTypeCode)
{
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.Int16
case TypeCode.UInt16:
case TypeCode.Int32:
case TypeCode.UInt32:
case TypeCode.Int64:
case TypeCode.UInt64:
case TypeCode.Single:
case TypeCode.Double:
case TypeCode.Decimal:
Console.WriteLine("Numeric");
break;
case TypeCode.Boolean:
Console.WriteLine("Bool");
break;
case TypeCode.DateTime:
Console.WriteLine("DateTime");
break;
case TypeCode.String:
Console.WriteLine("String");
break;
case TypeCode.Empty:
Console.WriteLine("Null");
break;
default: // TypeCode.DBNull, TypeCode.Char and TypeCode.Object
Console.WriteLine("Unknown");
break;
}
如果TypeCode 不能满足您的需求,那么您可以简单地将列类型转换为您自己的自定义枚举,如John's answer 中所述。
【讨论】:
你可以使用:
var types = new Dictionary<Type, SomeEnum>()
{
{ typeof(int), SomeEnum.Numeric },
{ typeof(long), SomeEnum.Numeric },
{ typeof(string), SomeEnum.String },
...
};
Func<Type, object, SomeEnum> getTypeEnum = (type, obj) =>
{
var result = types.ContainsKey(type)
? types[type]
: SomeEnum.Unknown;
if (obj == null || obj is DBNull)
{
result = SomeEnum.Null;
}
return result;
};
...
var e = getTypeEnum(col.DataType, row[col]);
【讨论】: