我有一个object
通过 COM 互操作调用的参数和传入对象的类型是System.Byte[*]
我想把它送到byte[]
;有没有办法在不复制的情况下做到这一点?
明确的演员阵容和as
关键字均失败。奇怪的是,如果我中断我的函数,这两种方法都会在“立即”窗口中按照我想要的方式工作。
public void DoIt(object param) {
var bbuf = param as byte[];
// bbuf is NULL here
bbuf = (byte[])param;
// Throws cast exception
// This works, but I don't want to copy
var abuf = param as Array;
bbuf = new byte[abuf.Length];
abuf.CopyTo(bbuf, 0);
}
方式byte[*]
是一个非零下界的单维数组。例如,下界为 1 的数组。普通一维数组是从零开始的(SZ 数组)。在我看来,唯一的做法就是复制它:
public static T[] ToSZArray<T>(Array array)
{
T[] dest = new T[array.Length];
Array.Copy(array, dest, array.Length);
return dest;
}
(完整代码 https://gist.github.com/Virtlink/7457611)
不幸的是我找不到任何MSDN文档byte[*]
。我唯一知道的是byte[*]
名称用于突出它与 SZ 数组之间的区别byte[]
。后者在 CLI 中有特殊支持和说明。
用法示例:
// Create an array string[1..4]
var arr = Array.CreateInstance(typeof(string),
lengths: new[] { 4 },
lowerBounds: new[] { 1 });
// Some values.
arr.SetValue("1", 1);
arr.SetValue("2", 2);
arr.SetValue("3", 3);
arr.SetValue("4", 4);
// The conversion to an SZ-array.
string[] dest = ToSZArray<string>(arr);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)