2010-12-27 27 views
10

Tôi làm C# excel interop. Tôi gọi các macro từ C# và tôi mong đợi các mảng của các đối tượng. Tôi có thể nhận mảng mảng 2 chiều từ các macro trả về mảng 2 chiều.Loại đối tượng `Object [*]` này mà tôi nhận được với COM interop là gì?

Tuy nhiên, một macro khác (bên thứ ba) được cho là trả lại mảng một chiều. Tôi không thể nhận được các (object[])xlApp.Run(...) làm việc (nó ném một ngoại lệ), và các loại thông tin trong trình gỡ lỗi nói kết quả là loại Object[*]. Thông báo thực tế từ ngoại lệ là

Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'. 

Loại Object[*] này là gì và làm cách nào để lấy mảng một chiều từ này?

EDIT: Đã xảy ra với tôi rằng điều này có thể có nghĩa là SAFEARRAY của VARIANTS. Nhưng sau đó, hai câu hỏi phát sinh: tại sao mọi thứ đều ổn với mảng 2 chiều? Làm cách nào để chuyển đổi SAFEARRAY thành mảng C#?

Trả lời

9

tôi foulnd bài viết khác nhau về vấn đề của bạn:

OPCFondation : Về cơ bản thay vì tuyên bố nó như là một mảng của các đối tượng, bạn chỉ có thể tuyên bố nó như một mảng mà không cung cấp bất kỳ loại phần tử. Vì vậy, không cast trong Object [] nhưng Array, và sử dụng một vòng lặp foreach để sử dụng subarray.

foreach(object subobject in (Array)myarrayitem) 
{ 
    //do stuff with the subobject, even browse further 
} 

Giải pháp này có vẻ hiệu quả vì bạn có thể tìm lại nó here.

On StackOverflow: chúng nói về mảng có giới hạn dưới> 0, cung cấp cho bạn loại Object [*], với một số liên kết thú vị về chủ đề, nhưng tôi nghĩ ý tưởng đầu tiên là tốt nhất.

0

Đây là một PITA như vậy. Tôi đã có mã này trong hai dự án:

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) 
    { 

Một người khác làm việc thì không. Sự khác biệt. Làm việc ai bị nhắm mục tiêu Net 2.0 và kia là Net 4.0 đã được đưa ra các lỗi:

Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'.

Hóa ra nếu bạn thay đổi phiên bản Visual Studio của bài viết này từ VS2005 để VS2010 những thay đổi LinkSources datatype.

MSDN Workbook.LinkSources Method

VS2010:

Object LinkSources(
    Object Type 
) 

VS2005:

public virtual Object LinkSources (
    [OptionalAttribute] Object Type 
) 
4

Sử dụng

System.Array a = (System.Array)((object) returnedObject); 
Các vấn đề liên quan