【问题标题】:How to determine if the type of a DataColumn is numeric, string, or datetime?如何确定 DataColumn 的类型是数字、字符串还是日期时间?
【发布时间】:2010-06-22 21:59:11
【问题描述】:

我需要根据 DataTable 中 DataColumns 的类型来格式化输出。

具体来说,我需要将内置的原始类型(int、string、decimal、DateTime 等)映射到:

  • SomeEnum.Numeric
  • SomeEnum.Bool
  • SomeEnum.DateTime
  • SomeEnum.String
  • SomeEnum.Unknown
  • SomeEnum.Null

我该怎么做?

【问题讨论】:

    标签: .net types


    【解决方案1】:

    如果内置的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 中所述。

    【讨论】:

    • 我可以返回 SomeEnum 值而不是写 cout。看起来不错。
    • +1 谢谢,不知道你可以像这样切换内置类型 - 直到现在我不得不为此使用自定义字典
    【解决方案2】:

    你可以使用:

    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]);
    

    【讨论】:

    • 这也是我的解决方案。只有 17 个allowed types。
    • 我喜欢类型推断、lambda 和对象构造的蓬勃发展。 :)
    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多