【问题标题】:How to Get the length of a TypeCode如何获取 TypeCode 的长度
【发布时间】:2009-06-23 18:34:56
【问题描述】:

我确信这是一个简单的问题,但我没有答案。这是情景和问题。

我有一个以特定格式存储的数组。该格式包含一个 Header 记录,其后有多个详细记录。记录的标题告诉我使用什么 TypeCode 来存储数据,例如 Int32。

我有一个例程,它接受一个 byte[] 数组并将字节数据转换回它在 C# 中的正确格式。该例程需要适当的字节数才能使转换成功。

问。那么如何从给定的 TypeCode 中获取字节长度以传递给 Convert 函数,而不必对每种类型的长度进行硬编码?

【问题讨论】:

    标签: c# .net type-conversion


    【解决方案1】:

    鉴于TypeCode 只是一组固定值的枚举,您可以轻松地硬编码它们的字典,例如

    private static readonly Dictionary<TypeCode,int> TypeCodeLength =
        new Dictionary<TypeCode,int> {
        { TypeCode.Int32, 4 },
        { TypeCode.Int64, 8 },
        { TypeCode.Char, 2 },
        // etc
    }
    

    (等效的解决方案是使用 switch/case 语句 - 如果您只包含值,它们实际上是等效的。)

    有些,比如stringobject 会是可变的 - 而其他的则取决于你如何编码像DateTime 这样的东西。

    除非这是使用标准转换,否则框架中的任何内容都无法为您提供长度。我知道硬编码通常不受欢迎,但在这种情况下,它只存在于一个地方,并且将是最简单的选择。

    【讨论】:

    • 我一定误解了这个问题。 :) 对于这个实现,您似乎可以使用像 BSTR 这样的模型,其中数组的前四个字节表示类型的长度或类似的约定。
    • 当然,就像开关一样,如果引入了新类型,它就会中断。
    • 向枚举引入新成员总是是一个重大变化。我预计 TypeCode 枚举不会很快改变......微软不太可能想要破坏每个打开它的开发人员的代码。
    • 感谢有趣的解决方案!
    【解决方案2】:

    根据How to create Type from TypeCode...,您不能(没有详尽的开关)。当然另一个方向(Type->TypeCode)是微不足道的。

    【讨论】:

      【解决方案3】:

      答案已经给出,但我在下面给出了完整的例程,以供需要的人重复使用:

      /// <summary>
      /// Helper class for manipulations at but level
      /// </summary>
      public static class BitHelper
      {
          /// <summary>
          /// Get a TypeCode bytes length
          /// See : https://docs.microsoft.com/en-us/dotnet/api/system.typecode?view=netcore-3.1
          /// </summary>
          /// <param name="typeCode"></param>
          /// <returns></returns>
          public static byte GetTypeCodeByteLength(TypeCode typeCode)
          {
              byte bytesLength = 0;
      
              switch (typeCode)
              {
                  case TypeCode.Object:
                      bytesLength = 4;
                      break;
                  case TypeCode.DBNull:
                      bytesLength = 4;
                      break;
                  case TypeCode.Boolean:
                      bytesLength = 1;
                      break;
                  case TypeCode.Char:
                      bytesLength = 2;
                      break;
                  case TypeCode.SByte:
                      bytesLength = 1;
                      break;
                  case TypeCode.Byte:
                      bytesLength = 1;
                      break;
                  case TypeCode.Int16:
                      bytesLength = 2;
                      break;
                  case TypeCode.UInt16:
                      bytesLength = 2;
                      break;
                  case TypeCode.Int32:
                      bytesLength = 4;
                      break;
                  case TypeCode.UInt32:
                      bytesLength = 4;
                      break;
                  case TypeCode.Int64:
                      bytesLength = 8;
                      break;
                  case TypeCode.UInt64:
                      bytesLength = 8;
                      break;
                  case TypeCode.Single:
                      bytesLength = 4;
                      break;
                  case TypeCode.Double:
                      bytesLength = 8;
                      break;
                  case TypeCode.Decimal:
                      bytesLength = 16;
                      break;
                  case TypeCode.DateTime:
                      bytesLength = 8;
                      break;
                  case TypeCode.String:
                      bytesLength = 4;
                      break;
                  default:
                      // Error
                      break;
              }
      
              return bytesLength;
          }
      }
      

      问候

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-18
        • 2012-12-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        相关资源
        最近更新 更多