我将UDP消息作为字节数组接收,并且根据第一个字节中的某些细节,我需要将剩余的字节转换为其他数据类型的多种不同可能排列。
这些数据类型主要是'uint','ushort'和'byte',但可以采用任何顺序,并且可以有任意数量。每个项目都有一个命名变量。
我尝试使用许多不同的选项,并且越来越接近了,但是我觉得我创建的方法并不是最好的。在一些我想使用“ sizeof”但又不想将代码标记为“不安全”的地方。我试图在输入上使用'params'关键字,但这不能与'ref'结合使用。我想使用泛型将它们传递给T1,T2等最大数量,但是意识到我无法枚举它们。现在,我将变量数组与'ref'关键字一起传递,这意味着在内存中创建该数组,但是只有该数组会使用更改后的值而不是原始变量进行更新。
byte[] message = new byte[] { }; //some byte array
ushort item1 = default(ushort);
byte item2 = default(byte);
var argumentArray = new object[] { item1, item2 };
ConvertArray(response, ref argumentArray);
private void ConvertArray(byte[] response, ref object[] items)
{
int index = 0;
for (int i = 0; i < items.Length; i++)
{
var item = items[i];
var itemType = item.GetType();
var itemSize = SizeOf(item.GetType());
if (itemSize == 0)
{
continue;
}
else if (itemSize == 1)
{
items[i] = response[index];
}
else
{
var method = typeof(BitConverter).GetMethod($"To{itemType.Name}");
var returned = method.Invoke(null, new object[] { response, index });
items[i] = Convert.ChangeType(returned, itemType);
}
index = index + itemSize;
}
}
private int SizeOf(Type type)
{
switch (type.Name)
{
case nameof(UInt16):
return 2;
case "Byte":
return 1;
default:
return 0;
}
}
因此,这部分起作用是因为'argumentArray'正在使用'ConvertArray'方法中的值进行更新,但是我敢肯定有一种使用Types进行此操作的更整洁的方法。
理想情况下,我不需要创建“ argumentArray”,而只需将项目(例如Item1和Item2)直接作为方法的参数传递。