我使用此代码获取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[*]
- 这是什么意思?
答案 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);
}