[英]C# unable to cast object of type 'system.string' to type 'system.int32'
[英]MS Word Automation in C# - Unable to cast object of type 'System.String[*]' to type 'System.String[]'
我使用此代码获取 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[*]
- 这是什么意思?
string[]
是一个向量 - 一个从 0 开始的一维数组。 然而, string[*]
是一个恰好只有一维的常规数组。 基本上,您必须将其作为Array
处理,然后将数据复制出来,或者使用Array
API 而不是string[]
API。
这与typeof(string).MakeArrayType()
(向量)和typeof(string).MakeArrayType(1)
(一维非向量)之间的区别相同。
尝试
object arr_r = Document.GetCrossReferenceItems(WdReferenceType.wdRefTypeHeading);
Array arr = ((Array) (arr_r));
string myHeading = (string) arr.GetValue(1);
问题是您在显然不是故意的情况下使用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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.