c#中的MS Word自动化-无法强制转换类型为'System.String[*]'键入'Sys

本文关键字:System String Sys 键入 类型 自动化 Word MS 中的 转换 | 更新日期: 2023-09-27 18:05:52

我使用以下代码来获取MS Word 2007文档(.docx)中使用的标题字符串数组:

dynamic arr = Document.GetCrossReferenceItems(WdReferenceType.wdRefTypeHeading);

使用调试器,我看到arr被动态分配了一个字符串数组,其中包含文档中所有标题的标题(大约40个条目)。到目前为止一切顺利。

然后,我想访问字符串,但无论我怎么做,我得到以下异常:

InvalidCastException: 
           Unable to cast object of type 'System.String[*]' to type 'System.String[]'.

我已经尝试了不同的方式访问字符串:

由指数:

String arr_elem = arr[1];

通过强制转换为IEnumerable:

IEnumerable list = (IEnumerable)arr;

使用一个简单的foreach循环:

foreach (String str in arr)
{
   Console.WriteLine(str);
}

然而,无论我怎么尝试,我总是以如上所示的相同异常结束。

谁能解释我在这里错过了什么/我做错了什么?特别是String[*],它是什么意思?

c#中的MS Word自动化-无法强制转换类型为'System.String[*]'键入'Sys

string[]是一个向量-一个基于1-d, 0的数组。然而,string[*]是一个常规数组,其中恰好具有一维。基本上,您将不得不将其作为Array来处理,并且要么复制数据,要么使用Array API而不是string[] API。

这与typeof(string).MakeArrayType()(矢量)和typeof(string).MakeArrayType(1)(一维非矢量)之间的差异相同。

try

object arr_r = Document.GetCrossReferenceItems(WdReferenceType.wdRefTypeHeading);
Array arr = ((Array) (arr_r));
string myHeading = (string) arr.GetValue(1);

问题是您在显然不是有意的情况下使用dynamic。当动态运行时看到一个1D数组时,它假设是一个向量,并尝试对其进行索引或枚举,就好像它是一个向量一样。这是一种罕见的情况,你有一个1D数组不是一个矢量,所以你必须处理它作为一个Array:

Array arr = (Array)(object)Document.
            GetCrossReferenceItems(WdReferenceType.wdRefTypeHeading);
// works
String arr_elem = arr.GetValue(1);
// now works
IEnumerable list = (IEnumerable)arr; 
// now works
foreach (String str in arr)
{
    Console.WriteLine(str);
}
相关文章: