重写结构';属性

本文关键字:属性 结构 重写 | 更新日期: 2023-09-27 18:01:14

我正试图使用Naudio库在我的电脑上迭代我的所有Playbackdevices。

代码非常直接:

for (int i = 0; i < WaveOut.DeviceCount; i++)
     {
         WaveOutCapabilities WOC = WaveOut.GetCapabilities(i);
         MessageBox.Show(WOC.ProductName);
     }

不过,我遇到了一个问题,结构中的const int基本上是在ProductName字符串超过32个字符时将其截断,这很烦人。

所以我想知道如何将这个32个字符的长度更改为更大的长度,以适合每个ProductName。我唯一能想到的就是覆盖整个结构(或者只是数字32,到一个更大的结构(,但这是不可能的。如何更改此值?

您可以在这里看到结构(需要更改的是private const int MaxProductNameLength = 32;(

我以前从来没有做过这样的事,我想知道这是否可能。

重写结构';属性

你不能。const值在编译时进行评估。当您的代码与库进行交互时,已经太晚了。

请注意,即使您可以更改const值,其在库中的使用也是在编译时评估的。也就是说,使用它的[MarshalAs]属性已经确定。因此,更改const值不会对该字段的封送方式产生任何影响。

正如一些评论者所指出的,通过对原始库(哪一个是开源的?(进行大量修改,您可能能够支持更长的名称,尽管仍然不能以底层平台API可见的方式。

或者,你可以在它周围添加自己的包装器。也就是说,使用库中允许的32个字符将整数值存储为字符串,然后在其他地方根据需要将该字符串格式的整数映射到更长的字符串,并根据需要从更长的字符串返回到字符串格式的整型。

您可以使用一个简单的静态int字段生成整数,每次需要新值时(即,任何时候您试图从较长的字符串映射到字符串格式的整数,但找不到匹配项时(都会递增该字段。

也就是说,当调用库时,从您自己代码的较长名称映射到字符串格式的整数。当从使用字符串格式整数的库接收信息时,将其映射回您自己代码的较长名称。你可以双向使用词典。