2012-10-31 36 views
10

Tôi cố gắng triển khai thư viện kết buộc dựa trên sự phản chiếu tới Microsoft Office. Các thuộc tính và phương thức của đối tượng Offce COM được gọi theo cách sau:Gọi [int index] này qua phản ánh

Type type = Type.GetTypeFromProgID("Word.Application"); 
object comObject = Activator.CreateInstance(type); 
type.InvokeMember(<METHOD NAME>, <BINDING FLAGS>, null, comObject, new object[] { <PARAMS>}); 

InvokeMember là cách duy nhất có thể vì Type.GetMethod/GetProperty làm việc không đúng với các đối tượng COM.

Phương pháp và tài sản có thể được gọi bằng InvokeMember nhưng bây giờ tôi phải giải quyết các vấn đề sau đây:

Phương pháp gia cố cuộn văn phòng-interop:

Excel.Workbooks wb = excel.Workbooks; 
Excel.Workbook firstWb = wb[0]; 

tương ứng

foreach(Excel.Workbook w in excel.Workbooks) 
    // doSmth. 

thế nào Tôi có thể gọi nhà điều hành [int index] này của Excel.Workbooks thông qua phản ánh không?

+0

http://stackoverflow.com/questions/6202523/is-listi-an-alias-for-list-get-itemi-in-c – Rover

Trả lời

6

Tôi có thể đã hiểu sai câu hỏi của bạn, nhưng hy vọng điều này sẽ giúp một số câu hỏi.

này được n: workbook thứ khi bạn có một workbook:

typeof(Workbooks).GetMethod("get_Item").Invoke(excel.Workbooks, new object[] { n }); 

GetMethod dường như làm việc spendidly đối với tôi, mặc dù những phiên bản của .NET bạn đang sử dụng?

Nếu không điều này có thể làm việc:

typeof(Workbooks).InvokeMember("Item", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, new object[] { n }); 

này một (Đếm) cũng rất hữu ích:

typeof(Workbooks).InvokeMember("Count", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, null). 

Để có được workbook nếu type là kiểu excel:

type.InvokeMember("Workbooks", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, null) 
+0

câu trả lời của bạn đã giải quyết được vấn đề: Tôi gọi thành viên "Item" nhưng tôi đã phải sử dụng "InvokeMethod" BindingFlag. :-) –

0

Thử gọi "get_Item".

Thats cách tính thuộc tính được lập chỉ mục, như các thành viên được gọi là get_Item.

0

Tôi đã giải quyết vấn đề của tôi bằng cách liệt kê các đối tượng COM:

public Workbook this[int iIndex] 
{ 
get 
{ 
    int c = 0; 
    foreach (Workbook wb in this) 
    { 
    if (c == iIndex) 
    return wb; 
    c++; 
    } 
    return null; 
} 
} 

// ... 

// The Workbook object is a wrapper for the COM object Excel.Workbook 
IEnumerator<Workbook> IEnumerable<Workbook>.GetEnumerator() 
{ 
foreach (var obj in (IEnumerable)m_COMObject) 
    yield return obj == null ? null : new Workbook(obj, this); 
} 

Tôi biết đó là một giải pháp khó chịu nhưng nó hoạt động. :-)

nhờ sự giúp đỡ của bạn

+0

Bạn đã giải quyết được vấn đề của mình nhưng bạn KHÔNG trả lời đúng câu hỏi của mình. Khi ai đó tìm kiếm sự cố cụ thể của bạn, anh ta có thể tìm thấy câu hỏi này nhưng câu trả lời được đánh dấu là chính xác không phải là câu trả lời mà anh ấy đang tìm kiếm. Vui lòng refactor câu hỏi/câu trả lời của bạn. –

Các vấn đề liên quan