我在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
转换为uint8_t *
,然后才能获得他们的长度。根据IntelliSense,它们的类型为System::Collections::Generic::IEnumerable<unsigned char> ^
,并且它们根本没有公共方法。
这似乎应该是显而易见的事情,所以我觉得我一定错过了一些明显的东西。
答案 0 :(得分:4)
您需要的是首先将IEnumerable转换为托管数组,然后将托管数组转换为本机数组。
由于ToArray是一种扩展方法,在C ++ / CLI中,您可以将其称为静态函数:
array<unsigned char>^ a = Enumerable::ToArray<unsigned char>(PartOne);
如何将数据从托管数组复制到本机数组,您可以找到如何执行此操作here。
答案 1 :(得分:2)
不确定为什么Intellisense不起作用,但你应该有一些公共方法(GetEnumerator
和从object
继承的方法)。您不会看到扩展方法,但您应该可以将它们称为Enumerable
类中的静态方法:
int partOneCount = Enumerable::Count(packet -> PartOne);
int partTwoCount = Enumerable::Count(packet -> PartTwo);
(我可能略微关闭了C ++语法,因为我不太习惯,但你应该明白这一点 - 任何人都可以自由地纠正语法)