gpt4 book ai didi

c# - 为数组本身实现 `.CopyTo(Array,int)` 作为目标数组(将被复制到)

转载 作者:行者123 更新时间:2023-11-30 23:14:30 31 4
gpt4 key购买 nike

在类定义中,我实现了 IList<T>使它看起来像一个数组。

    // Foo has C++ arrays inside for a 
// fast communication with some hardware
public abstract class Foo<T> : IList<T(or uint for a derived class)>
{
public virtual void CopyTo(uint[] array, int arrayIndex)
{
int dL = Length;
if (dL == array.Length)
{
/* needs pinning the target before this?*/
Marshal.Copy(handleForFooUnmanagedArray,
(int[])(object) array,
arrayIndex,
dL - arrayIndex);
return;
}
throw new NotImplementedException();
}
}

所以它现在可以这样做:

 uint [] bar = new uint[L];
foo.CopyTo(bar,0);

但现在我想让它像数组一样工作:

 uint [] bar = new uint[L];
bar.CopyTo(foo,0);

所以我查看了数组在运行时(here)实现的接口(interface),以找到类似私有(private) .CopyFrom 的东西我认为应该在 `.CopyTo' 中称为 implicity,

  • 列表
  • 可克隆
  • ICollection
  • 可枚举
  • IStructuralComparable
  • IStructuralEquatable

这些都没有 .CopyFrom .

也许有一些IntPtr属性作为 Marshal 的句柄复制 .CopyTo但我在智能感知中看不到它。

问题:

我如何找到执行 .CopyTo 的方法?用于获取有关目标数组的必要信息以及那是什么必要信息?另一种方法,如 .CopyFrom或者指向目标数组开始的句柄,或者存储在某处的一些解释器中间代码?目标数组是否固定在进程中?

附带问题:

我需要在 IList<T> 中实现一些额外的方法吗?在重要的(未知的)之上?

我已经实现了 toArray , Count[]但我还没有为别人做过任何事。那么Foo还有Length (带有自定义界面)但它不属于 Array所以uint[]不得在其 CopyTo 中使用它.

我没有使用 IL 的经验,所以我可能不明白这是否是解决方案,但我可以及时回顾。

我还尝试实现 Array,但由于是特殊类而拒绝实现。

非常感谢您的宝贵时间。

最佳答案

CopyTo 由运行时本身在非托管代码中实现,方法签名如下所示:

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);

如您所见,它仍然需要 Array 而不是某个指针,因此很难按您的意愿行事。

但是,如果您可以在 Foo 中拥有一个托管数组,那么就很容易实现目标 - 只需像这样使用隐式转换为 Array:

class MyFakeArray {
uint[] _realArray = new uint[10];

public MyFakeArray() {

}

public static implicit operator uint[](MyFakeArray a) {
return a._realArray;
}
}

然后 CopyTo 将按预期工作:

var a = new uint[10];
var fa = new MyFakeArray();
a.CopyTo(fa, 0);

关于c# - 为数组本身实现 `.CopyTo(Array,int)` 作为目标数组(将被复制到),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43009498/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com