覆盖结构'属性

时间:2015-07-07 00:16:37

标签: c# struct override

我试图在我的电脑上使用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到更大的结构),但它无法完成。我该如何改变这个值?

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

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

1 个答案:

答案 0 :(得分:0)

你做不到。在编译时评估const值。当您的代码与库交互时,为时已晚。

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

正如一些评论者指出的那样,通过对原始库(开源?)进行一些大量修改,您可能能够支持更长的名称,但仍然不能以底层平台API可见的方式进行。< / p>

或者,您可以在它周围添加自己的包装器。即使用库中允许的32个字符将整数值存储为字符串,然后在其他地方根据需要将该字符串格式的整数映射到较长的字符串,并根据需要将字符串格式的整数映射到较长的字符串中。 / p>

您可以使用一个简单的静态int字段生成整数,每当您需要一个新值时(即,您尝试从较长的字符串映射到字符串格式的整数并且无法找到)一场比赛)。

即。在调用库时,从您自己的代码的较长名称映射到字符串格式的整数。从库中接收使用字符串格式整数的信息时,将其映射回您自己代码的较长名称。您可以在两个方向上使用词典。