2012-10-31 8 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 }); 

をこの1つは(カウント)も非常に有用である:

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

問題は解決しましたが、質問に正しく答えられませんでした。誰かがあなたの特定の問題を検索するとき、彼はこの質問を見つけるかもしれませんが、正しいとマークされた答えは彼が探しているものではありません。あなたの質問/回答をリファクタリングしてください。 –

関連する問題