设置Array的Length属性

mor*_*avi 11 c# arrays unity-game-engine

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

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

此外,我无法更改SetVertices代码,因为它属于另一个库.它需要V[].我无法传递IList<V>或传递V*给它.

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

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

编辑:

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

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

接下来会尝试代码注入.

EDIT2:

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

Val*_*rov 1

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