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

InvokeMember 是唯一可能的方法,因为 Type.GetMethod / GetProperty 无法与 COM 对象一起工作。

可以使用 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

7

我可能误解了您的问题,但希望这对您有所帮助。

当您有工作簿时,这将获得第 n 个工作簿:

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

GetMethod似乎对我来说工作很费钱,你使用的是什么版本的 .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).

如果 type 是 excel 类型,则获取工作簿:

type.InvokeMember("Workbooks", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, null)
于 2012-11-01T16:26:08.940 回答
0

尝试调用“get_Item”。

这就是索引属性的编译方式,作为称为 get_Item 的成员。

于 2012-11-01T16:36:27.480 回答
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 回答