11

リフレクション ベースの遅延バインディング ライブラリを Microsoft Office に実装しようとしています。Office COM オブジェクトのプロパティとメソッドは、次の方法で呼び出されます。

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

Type.GetMethod / GetProperty は COM オブジェクトで適切に動作しないため、InvokeMember が唯一可能な方法です。

InvokeMember を使用してメソッドとプロパティを呼び出すことができますが、次の問題を解決する必要があります。

office-interop ラッパーのメソッド:

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

それぞれ

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

リフレクション経由で Excel.Workbooks の this[int index] 演算子を呼び出すにはどうすればよいですか?

4

3 に答える 3

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

私はそれが不快な解決策であることを知っていますが、うまくいきます。:-)

ご協力いただきありがとうございます

于 2012-11-05T13:07:21.193 に答える