我确信这是一个简单的问题,但我没有答案。这是senario和问题。
我有一个以特定格式存储的数组。该格式包含一个Header记录,其后面有muntiple详细记录。记录的标题告诉我使用什么TypeCode来存储数据,例如Int32。
我有一个例程,它接受一个byte []数组并将字节数据转换回它在C#中的正确格式。此例程需要适当的字节数才能使转换成功。
Q值。那么如何从给定的TypeCode获取字节长度以传递给Convert函数而不必对每种类型的长度进行硬编码?
答案 0 :(得分:3)
鉴于TypeCode
只是一组固定值的枚举,您可以轻松地对它们的字典进行硬编码,例如。
private static readonly Dictionary<TypeCode,int> TypeCodeLength =
new Dictionary<TypeCode,int> {
{ TypeCode.Int32, 4 },
{ TypeCode.Int64, 8 },
{ TypeCode.Char, 2 },
// etc
}
(等效的解决方案是使用switch / case语句 - 如果你只是包含值,它们实际上是等价的。)
有些内容,例如string
和object
会变量 - 而其他内容则取决于您对DateTime
等内容的编码方式。
除非使用标准转换,否则框架中的任何内容都无法为您提供长度。我知道硬编码通常是不受欢迎的,但在这种情况下,它只在一个地方,并且将是最简单的选择。
答案 1 :(得分:0)
根据How to create Type from TypeCode...,您不能(没有详尽的转换)。当然,另一个方向(Type-&gt; TypeCode)是微不足道的。
答案 2 :(得分:0)
答案已经给出,但是我在下面给出了完整的例程,供需要的人重复使用:
/// <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;
}
}
致谢