如何访问IEnumerable在c++ / CLI

本文关键字:byte c++ CLI IEnumerable 何访问 访问 | 更新日期: 2023-09-27 18:19:03

我在c#中定义了一个这样的接口:

public interface ISender
{
    ReponseType SendData(PacketType packet);
}

其中PacketType看起来像这样(c#):

public struct PacketType
{
    public IEnumerable<byte> PartOne;
    public IEnumerable<byte> PartTwo;
}

我想用c++编写这个接口的一个实现(因为c++库中提供了一个协议实现,并且在c++中在托管和非托管代码之间跳转相当容易)。我已经创建了一个ref class,并实现了足够多的编译、链接和调试所需的方法:

ResponseType MySender::SendData(PacketType packet)
{
    return ResponseType::Failure;
}

现在我坚持把IEnumerable s转换成uint8_t *,并得到它们的长度。根据IntelliSense,它们的类型为System::Collections::Generic::IEnumerable<unsigned char> ^,并且它们根本没有附加的公共方法。

这似乎应该是显而易见的,所以我觉得我一定是错过了一些明显的东西。

如何访问IEnumerable<byte>在c++ / CLI

您需要首先将IEnumerable转换为托管数组,然后将托管数组转换为本机数组。

由于ToArray是一个扩展方法,在c++/CLI中,可以将其作为静态函数调用:

array<unsigned char>^ a = Enumerable::ToArray<unsigned char>(PartOne);

关于如何将数据从托管数组复制到本机数组,您可以在这里找到如何操作。

不知道为什么智能感知不工作,但你应该有一些公共方法可用(GetEnumerator和从object继承的方法)。您将看不到扩展方法,但您应该能够从Enumerable类调用它们作为静态方法:

int partOneCount = Enumerable::Count(packet -> PartOne);
int partTwoCount = Enumerable::Count(packet -> PartTwo);

(我可能有c++语法有点偏差,因为我不怎么用它,但你应该明白-任何人都可以自由地纠正语法)