2016-05-13 88 views
0

我需要将short []转换为对象[]。原因是需要我在相同的成员变量中存储short []或char [],具体取决于另一个属性。我使用的类是用C++/CLI编写的,并使用C#。 C++/CLI属性是将C#short []转换为对象[]

property cli::array<Object^>^ Data { 
    cli::array<Object^>^ get(); 
    void set(cli::array<Object^>^ d); 
} 

有没有人知道如何将short []或char []转换为object []?还是有更好的解决方案,不要使用cli::array<Object^>^作为基础数据类型?


更新:我知道我可以通过所有这些项目走,并将其转换为对象或使用LINQ的方法shortArr.Cast<object>().ToArray()。但我想有一个更高性能的解决方案,所以也许有一种方法可以为这个属性使用另一个基础数据类型?

+0

“一个短[]或一个char []在同一个成员变量,根据另一个属性” - 为什么?这听起来像是一个X/Y问题。 C#中的属性是免费的,并且C#还支持''StructLayout]''类似'union'结构。 – Dai

+0

“或者有更好的解决方案,不要使用'cli :: array ^'作为基础数据类型?” - 这似乎是一个很好的问题,但它需要更多的信息才能得到有用的答案,而且它与您的主要问题无关。 – hvd

+0

没有转换,数组内容在内存中物理上不同。它从每个元素4个或8个字节(取决于位数)折叠为2或1.因此,您必须*复制。如果性能很重要,则一系列盒装值不属于您的功能列表。 –

回答

2

使用object[]代替char[]short[]在内存和CPU周期方面都是浪费。

由于两个char[]short[]延伸Array,可以同时存储种阵列中Array^类型的变量,然后根据需要强制转换为所需的类型。

+0

是的,但据我所知,我不能声明一个类型为'cli :: array ^'的C++/CLI属性而不指定数组类型。在C#中这是可能的。 – Mirko

+1

@Mirko我认为这个类型应该是'Array ^',而不是'cli :: array ^'。 – dasblinkenlight

+1

谢谢你的解决方案。如果你做出答案,我可以将其标记为解决方案。 – Mirko

1

不,你必须通过所有的项目。

C#,需要拳击到ValueType存储到object变量,因此阵列中的所有short值必须盒装成一object[]阵列一个接一个。