2012-10-31 7 views
10

Si tenta di implementare una libreria tardiva basata su reflection in Microsoft Office. Le proprietà ei metodi degli oggetti COM offce sono chiamate nel seguente modo:Chiamare questo [int index] tramite riflessione

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

InvokeMember è l'unico modo possibile perché Type.GetMethod/GetProperty funziona in modo non corretto con gli oggetti COM.

Metodi e proprietà può essere chiamato con InvokeMember ma ora devo risolvere il seguente problema:

Metodo nella confezione ufficio di interoperabilità:

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

rispettivamente

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

Come posso chiamare questo operatore [int index] di Excel.Workbooks tramite riflessione?

+0

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

risposta

6

Potrei aver frainteso la tua domanda, ma spero che questo aiuti qualcuno.

Questo ottiene il n: esimo cartella di lavoro quando si dispone di una cartella di lavoro:

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

GetMethod sembra funzionare in splendide per me però, quale versione di .NET stai usando?

Altrimenti questo potrebbe funzionare:

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

Questo (Conte) è anche molto utile:

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

Per ottenere le cartelle di lavoro se il tipo è il tipo excel:

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

La tua risposta ha risolto il problema: ho invocato il membro "Item" ma ho dovuto usare "InvokeMethod" BindingFlag. :-) –

0

Prova a richiamare "get_Item".

Ecco come vengono compilate le proprietà indicizzate, come membri chiamati get_Item.

0

Ho risolto il mio problema enumerando l'oggetto 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); 
} 

So che è una soluzione sgradevole ma funziona. :-)

grazie per il vostro aiuto

+0

Hai risolto il problema ma NON hai risposto correttamente alla tua domanda. Quando qualcuno cerca il tuo problema specifico, può trovare questa domanda ma la risposta che è contrassegnata come corretta non è quella che sta cercando. Si prega di refactoring la tua domanda/risposta. –

Problemi correlati