2012-10-31 11 views
10

Próbuję zaimplementować opartą na refleksach bibliotekę z opóźnieniem do pakietu Microsoft Office. Właściwości i metody obiektów Offce COM nazywane są w następujący sposób:Wywołanie tego [indeksu int] za pomocą refleksji

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

InvokeMember jest jedynym możliwym sposobem, ponieważ Type.GetMethod/GetProperty działa nieprawidłowo z obiektami COM.

Metody i właściwości mogą być wywoływane za pomocą InvokeMember ale teraz muszę rozwiązać następujący problem:

Method w opakowaniu biurowo-międzyoperacyjne:

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

odpowiednio

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

Jak czy mogę wywołać tego operatora [indeksu indeksu] w Excel.Workbooks przez odbicie?

+0

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

Odpowiedz

6

Być może przegapiłam twoje pytanie, ale mam nadzieję, że to pomaga niektórym.

To dostaje N: th skoroszytu, gdy masz skoroszytu:

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

GetMethod wydaje się działać spendidly dla mnie jednak, co wersja .NET używasz?

W przeciwnym razie może to działa:

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

To jeden (Hrabia) jest również bardzo przydatne:

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

Aby uzyskać skoroszyty jeśli typ jest typem Excel:

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

Twoja odpowiedź rozwiązany problem: Wywołałem członka elementu, ale musiałem użyć "BindingFlag" InvokeMethod. :-) –

0

Spróbuj wywołać "get_Item".

To jest sposób, w jaki właściwości indeksowane są kompilowane, jak członkowie o nazwie get_Item.

0

Mam rozwiązać mój problem przez wyliczanie obiektu 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); 
} 

wiem, że to nieprzyjemne rozwiązaniem, ale to działa. :-)

dzięki za pomoc

+0

Rozwiązałeś swój problem, ale NIE odpowiedziałeś poprawnie na to pytanie. Kiedy ktoś szuka konkretnego problemu, może znaleźć to pytanie, ale odpowiedź, która jest oznaczona jako poprawna, nie jest tą, której szuka. Zastanów swoje pytanie/odpowiedź. –

Powiązane problemy