【发布时间】:2013-12-07 12:28:50
【问题描述】:
我有一个字节数据数组,但是这个数组可以保存任何无符号数(字节/ushort/uint/ulong)作为字节。
这样做的问题是再次将数据检索为所需的类型:我希望负责将数据转换回处理程序类中的所需数据类型,而不是再次请求数据的人(这可以转换返回的字节表示值的数组)。
此外,ref 或 out 变量虽然是一种解决方案,但很麻烦,因为我分配的成员不一定是我要返回的类型(阅读显式枚举):
public enum SomeEnum : ulong
{
// ...
}
我目前拥有的功能是:
/// <summary>
/// Get data (byte)
/// </summary>
public byte GetDataByte(byte dataIndex)
{
return this.Data[dataIndex];
}
/// <summary>
/// Get data (ushort)
/// </summary>
public ushort GetDataUshort(byte startingDataIndex)
{
ushort output = 0;
for (byte i = startingDataIndex; i < this.Data.Length && i < sizeof(ushort); i++)
{
output |= (ushort)(this.Data[i] << (i * 8));
}
return output;
}
/// <summary>
/// Get data (uint)
/// </summary>
public uint GetDataUint(byte startingDataIndex)
{
uint output = 0;
for (byte i = startingDataIndex; i < this.Data.Length && i < sizeof(uint); i++)
{
output |= ((uint)this.Data[i] << (i * 8));
}
return output;
}
/// <summary>
/// Get data (ulong)
/// </summary>
public ulong GetDataUlong(byte startingDataIndex)
{
ulong output = 0;
for (byte i = startingDataIndex; i < this.Data.Length && i < sizeof(ulong); i++)
{
output |= ((ulong)this.Data[i] << (i * 8));
}
return output;
}
能否将其合并为一个功能,我将如何去做?喜欢
SomeEnum member = (SomeEnum)GetData<ulong>(dataIndex);
但是
GetData<byte>(0);
public T GetData<T>(byte startingDataIndex) // T would be byte during runtime
{
return this.Data[dataIndex]; // Compiler: Er, T? Byte? what?
}
或
/// <summary>
/// Get data (T)
/// </summary>
public T GetData<T>(byte startingDataIndex)
{
T output = 0; // Compiler: derp, this isn't an integer.
for (byte i = startingDataIndex; i < this.Data.Length && i < System.Runtime.InteropServices.Marshal.SizeOf(typeof(T)); i++)
{
output |= (T)(this.Data[i] << (i * 8)); // Compiler: nor is this!
}
return output;
}
或者我真的最好离开作为单独的功能并维护它们?
【问题讨论】: