如何访问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转换为托管数组,然后将托管数组转换为本机数组。
由于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++语法有点偏差,因为我不怎么用它,但你应该明白-任何人都可以自由地纠正语法)