设置Array的Length属性

是否可以使用某种技术更改数组的Length属性?

我需要将数组的前x个成员传递给方法。 项目要求阻止我分配任何堆分配,因此我不能使用任何Array.Resize()或创建新数组。

此外, 我无法更改SetVertices代码,因为它属于另一个库。 它需要V[] 。 我无法将IListV*传递给它。

 public void BuildIt(V[] verts,int x){ verts.Length = x; //Compile error mesh.SetVertices(verts); } 

当然代码不会编译。 我需要一些像reflection或扩展方法这样的技术来将数组伪装成更小而不实际创建更小的数组。 我希望SetVertices()方法认为数组有x个成员,即使它有更多。

编辑:

测试了以下方法,它们不起作用:

  • stackalloc不起作用,因为它不会创建(或者我无法获得)真正的数组。
  • 窥视单项目我发现数组的Length属性调用GetLenght()和GetRank()方法来确定长度。 抛开一个不好的做法,我不能用扩展方法覆盖这个方法,因为实例方法优先于扩展方法(或者有没有办法强制使用?)。

接下来会尝试代码注入。

EDIT2:

试图将代码发送到Array.GetLength()Array.Length 。 似乎没有简单,可靠,跨平台和干净的方法来在运行时更改现有的方法体。

如果您真的必须以最高性能执行此操作 – 那么您必须知道您使用的特定 CLR的内存布局(在您的情况下似乎是某些版本的Mono)。 然后,您可以执行一些不安全的代码来更改和恢复数组长度。 但它不可维护危险

如果数组和x没有改变且它们的数量不是很大,那么你可以在全局而不是本地分配它们。 因此,您将投入内存并获得性能。