2012-10-31 59 views
10

我嘗試爲Microsoft Office實現基於反射的後期綁定庫。 的性質和Offce COM對象的方法被調用方式如下:通過反射調用[int index]

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

InvokeMember是唯一可行的辦法,因爲Type.GetMethod /的getProperty與COM對象不能正常工作,

的方法和屬性可以使用InvokeMember被調用,但現在我必須解決以下問題:

在辦公室,互操作包裝方法:

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

分別

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

如何我可以通過反射調用Excel.Workbooks的[int index]運算符嗎?

+0

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

回答

6

我可能會誤解你的問題,但希望這有助於一些。

這得到第n個工作簿,當你有一個工作簿:

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

GetMethod似乎爲我雖然spendidly工作,你使用的是什麼版本的.NET的?

否則這可能工作:

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

這一個(計數)也是非常有用的:

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

要獲得工作簿,如果類型是Excel類型:

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

你的回答解決了問題:我調用了「Item」成員,但我不得不使用「InvokeMethod」BindingFlag。 :-) –

0

嘗試調用「get_Item」。

這就是編譯索引屬性的方式,因爲成員稱爲get_Item。

0

我已經通過枚舉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); 
} 

我知道這是一個不愉快的解決方案,但它的工作原理。 :-)

感謝您的幫助

+0

你解決了你的問題,但你沒有正確回答你的問題。當有人搜索你的具體問題時,他可能會發現這個問題,但被標記爲正確的答案不是他正在尋找的答案。請重構您的問題/答案。 –