Автоматизация MS Word в C # - Невозможно привести объект типа 'System.String [*]' к типу "System.String []" - PullRequest
9 голосов
/ 17 августа 2011

Я использую этот код, чтобы получить массив заголовков 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[*] - что это значит?

Ответы [ 3 ]

7 голосов
/ 17 августа 2011

string[] - это вектор - массив на основе 1-го, 0-го.Однако string[*] - это обычный массив, в котором просто имеет одно измерение .По сути, вам придется обрабатывать его как Array, и либо скопировать данные, либо использовать Array API, а не string[] API.

Это то же самое, что и разницамежду typeof(string).MakeArrayType() (вектор) и typeof(string).MakeArrayType(1) (1-й не-вектор).

6 голосов
/ 17 августа 2011

попробуй

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

string myHeading = (string) arr.GetValue(1);
4 голосов
/ 17 августа 2011

Проблема в том, что вы используете 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);
}
...