C#中的MS Word Automation - 无法将类型为'System.String [*]'的对象强制转换为'System.String []'

时间:2011-08-16 20:02:18

标签: c# .net ms-word office-interop

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

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

使用调试器,我看到arr动态分配了一个String数组,其中包含文档中所有标题的标题(约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[*] - 这是什么意思?

3 个答案:

答案 0 :(得分:7)

string[]是一个向量 - 基于1-d,0的数组。但是,string[*]是一个常规数组,碰巧只有一个维度。基本上,您必须以Array处理它,并将数据复制出来,或使用Array API而不是string[] API。

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

答案 1 :(得分:6)

object arr_r = Document.GetCrossReferenceItems(WdReferenceType.wdRefTypeHeading);
Array arr = ((Array) (arr_r));

string myHeading = (string) arr.GetValue(1);

答案 2 :(得分:4)

问题是您在显然不是意图的情况下使用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);
}