【问题标题】:Modifying Array Length property through Reflection通过反射修改数组长度属性
【发布时间】:2018-08-19 02:32:55
【问题描述】:

所以,我遇到了一个奇怪的问题。

让你知道我想要实现的目标,但惨遭失败:

int[] testArray = new int[100];

typeof(int[])
.GetProperty("Length", BindingFlags.Instance | BindingFlags.Public)
.SetValue(testArray, 50);

是的,也就是说,我想修改 C# 数组的 Length 属性(仅使其小于实际大小),创建新数组并复制内容 - 以避免 GC 等...

背景:

在Unity中,有这个功能:

void SetIndices(int[] indices, MeshTopology topology, int submesh, bool calculateBounds);

如您所见,SetIndices 不接受“开始”和“结束”或至少“长度”作为参数。这就是为什么我想修改我的索引数组的长度来欺骗这个函数。

有什么想法吗?

【问题讨论】:

  • Length 属性是只读的。设置它不会做任何事情。
  • 我意识到,有没有可以修改的私有成员?

标签: c# arrays unity3d reflection private


【解决方案1】:

您无法在 C# 中调整 array 的大小。这是铁的事实。

实际上,Array.Resize 方法创建了一个新数组,并将前一个数组的值复制到新数组中。

【讨论】:

  • 我不想调整它的大小,事实上我想保持数组本身的完整性。我只想修改 Length 属性。
  • 在不修改数组实际长度的情况下修改Length 属性有什么意义?这是灾难的根源,除此之外没有任何意义。
  • 何为灾难?我只想使 Length 小于或等于实际数组长度。以及原因,因为我想使用的 API 读取该 Length 属性,因为我不想在调用此函数时每次都分配新数组(可能大到 ~200kb)。相信我,这并非没有意义。
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2019-02-28
相关资源
最近更新 更多