C#中的MS Word Automation – 无法将’System.String ‘类型的对象强制转换为’System.String ‘

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

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

使用调试器,我看到arr被动态分配了一个String数组,其中包含文档中所有标题的标题(大约40个条目)。 到现在为止还挺好。

然后,我想访问字符串,但不管我怎么做,我得到以下exception:

 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); } 

但是,无论我尝试什么,我总是会遇到如上所示的相同exception。

任何人都可以解释我在这里缺少什么/我做错了什么? 特别是String[*] – 它是什么意思?

尝试

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

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

这与typeof(string).MakeArrayType() (向量)和typeof(string).MakeArrayType(1) (1-d非向量)之间的差异相同。

问题是你在一个显然不是意图的情况下使用dynamic 。 当动态运行时看到一维数组时,它会假定一个向量,并尝试将其索引或枚举,就像它是一个向量一样。 这是一种极少数情况下,你有一个不是矢量的一维数组,所以你必须把它作为一个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); }