Что это за `Object [*]` тип, который я получаю с помощью COM-взаимодействия?
Я делаю С# excel interop. Я вызываю макросы из С#, и я ожидаю массивы объектов. Я могу получить 2-мерные массивы объектов из макросов, которые возвращают 2-мерные массивы.
Однако другой (сторонний) макрос должен возвращать одномерный массив. Я не могу заставить (object[])xlApp.Run(...)
работать (он генерирует исключение), а информация типа в отладчике говорит, что результат имеет тип Object[*]
. Фактическое сообщение из исключения
Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'.
Что это за тип Object[*]
и как получить из него одномерный массив?
EDIT. Мне пришло в голову, что это может означать SAFEARRAY of VARIANTS. Но тогда возникают два вопроса: почему все нормально с двумерными массивами? Как преобразовать SAFEARRAY в массив С#?
Ответы
Ответ 1
Я собираю различные статьи о вашей проблеме:
OPCFondation: В основном вместо того, чтобы объявлять его как массив объектов, вы можете просто объявить его как массив без предоставления какого-либо типа элемента. Поэтому не используйте в Object [], но Array, и используйте цикл foreach для использования подмассива.
foreach(object subobject in (Array)myarrayitem)
{
//do stuff with the subobject, even browse further
}
Это решение работает, так как вы можете найти его снова здесь.
fooobar.com/questions/506111/...: они говорят о массивах с нижней границей > 0, что дает вам тип Object [*], с некоторыми ссылками, которые могут быть интересны по предмету, но я думаю, что первая идея - хорошая.
Ответ 2
Используйте
System.Array a = (System.Array)((object) returnedObject );
Ответ 3
Это была такая ПИТА. У меня был этот код в двух проектах:
Workbook wb = null;
try
{
wb = excel.Workbooks.Open(filePath, false, true, 5, null, "WrongPAssword");
}
catch
{
return false;
}
try
{
Array links = (Array)wb.LinkSources(XlLink.xlExcelLinks);
if (links != null)
{
Один работал другой, нет. Разница. Рабочий был нацелен на .Net 2.0, а другой был .Net 4.0, который выдавал ошибку:
Невозможно передать объект типа 'System.Object [*]' для ввода типа 'System.Object []'.
Оказывается, если вы измените версию Visual Studio этой статьи с VS2005 на VS2010, измените тип данных LinkSources.
Метод MSDN Workbook.LinkSources
VS2010:
Object LinkSources(
Object Type
)
VS2005:
public virtual Object LinkSources (
[OptionalAttribute] Object Type
)