我有一个由第三方库提供的托管数组。数组的类型并不直接反映数组中存储的数据,而是将数据解释为整数。将托管数组无法复制到结构数组中
所以int[] data = Lib.GetData();
给我一个整数数组,我想铸成阵列的DataStructure
,可能看起来像这样的。
struct DataStructure {
public int Id;
public double Value;
}
目前我使用Marshal.Copy
(实现可以被看作here),但似乎有点过分复制整个事情。
难道这样的事情存在:
int[] data = Lib.GetData();
DataStructure[] dataStructs = InterpretAs<DataStructure>(data);
在不需要复制,但获得dataStruct
元素可以像dataStruct[1].Id
做什么?
编辑2:
如果我只想要一个可以DataStructure
,我可以用
public static T ToStruct<T>(byte[] bytes) where T : struct
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
T something = Marshal.PtrToStructure<T>(handle.AddrOfPinnedObject());
handle.Free();
return something;
}
这里不需要复制。
编辑:
的答案可能重复,目前大约7岁,他们由要么复制数据或实施黑客攻击。
即使在C中,这样的构造也是UB(其中原始副本也取决于实现)。你可以想象在一个强大的类型系统的托管世界... –
@kasperhj你确定它会导致性能问题吗?你真的需要[使其更快](http://ericlippert.com/2012/12/17/performance-rant/)?也许你可以要求第三方从他们的方法中提供更强的类型数据?在最坏的情况下,你可能会尝试使用不安全的代码(它应该允许做这样的事情),但是在做之前你应该考虑两次。 –
@EugenePodskal在我的应用程序中没有任何性能问题,但只是为了改变解释而进行了很多复制。 – kasperhj