2012-10-31 24 views
10

Microsoft Office'e yansıma tabanlı bir geç kitaplık kütüphanesi uygulamaya çalışıyorum. özellikleri ve Offce COM nesnelerinin yöntemler aşağıdaki yolu denir: Type.GetMethod/GetProperty COM nesneleri ile düzgün çalıştığı içinYansıma aracılığıyla bu [int dizini] çağrılıyor

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

ınvokemember mümkün tek yoludur.

Yöntemleri ve özellikleri ınvokemember kullanarak çağrılabilir ama şimdi aşağıdaki sorunu çözmek için vardır: office-birlikte çalışma ambalajında ​​

Yöntem: sırasıyla

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

Nasıl

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

Excel.Workbooks'un bu [int index] operatörünü yansıtma yoluyla çağırabilir miyim?

+0

Yanıtınız çözüldü http://stackoverflow.com/questions/6202523/is-listi-an-alias-for-list-get-itemi-in-c – Rover

cevap

6

Sorunu yanlış anlamış olabilirim, ama umarım bu biraz yardımcı olur.

Bu n alır:

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

GetMethod olsa benim için spendidly iş gibi görünüyor, sen .NET hangi sürümünü kullanıyor: Çalışma kitabında inci bir çalışma kitabını varken?

Aksi takdirde bu işe yarayabilecek:

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

(Kont) aynı zamanda son derece yararlıdır Bu seferki:

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

problem: "Öğe" üyesini çağırdım ama "InvokeMethod" BindingFlag'ı kullanmak zorunda kaldım. :-) –

0
: tip excel tipi ise

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

çalışma kitaplarını almak için

"get_Item" öğesini çağırmayı deneyin.

Dizine eklenen özelliklerin nasıl derlendiği, get_Item olarak adlandırılan üyeler.

0

Ben COM nesnesi numaralandırma tarafından benim problemini çözdük:

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); 
} 

Ben hoş olmayan bir çözüm biliyorum ama işe yarıyor. :-) Yardımlarınız için

sayesinde

+0

Sorununuzu çözdünüz ancak sorunun cevabını doğru bir şekilde vermediniz. Birisi sizin özel probleminizi ararken bu soruyu bulabilir, ancak doğru olarak işaret edilen cevap aradığı kişi değildir. Lütfen sorunuz/cevabınızı yeniden düzenleyin. –