首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过反射调用此[int index]

通过反射调用此[int index]
EN

Stack Overflow用户
提问于 2012-10-31 19:15:07
回答 3查看 3.8K关注 0票数 11

我尝试在Microsoft Office中实现一个基于反射的后期绑定库。Offce COM对象的属性和方法按以下方式调用:

代码语言:javascript
复制
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包装器中的方法:

代码语言:javascript
复制
Excel.Workbooks wb = excel.Workbooks;
Excel.Workbook firstWb = wb[0];

分别

代码语言:javascript
复制
foreach(Excel.Workbook w in excel.Workbooks)
  // doSmth. 

如何通过反射调用Excel.Workbooks的这个整数索引运算符?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-02 00:26:09

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

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

代码语言:javascript
复制
typeof(Workbooks).GetMethod("get_Item").Invoke(excel.Workbooks, new object[] { n });

不过,我想问一下,你使用的是什么版本的.NET?

否则,这可能会起作用:

代码语言:javascript
复制
typeof(Workbooks).InvokeMember("Item", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, new object[] { n });

这一条(Count)也非常有用:

代码语言:javascript
复制
typeof(Workbooks).InvokeMember("Count", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, null).

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

代码语言:javascript
复制
type.InvokeMember("Workbooks", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, null)
票数 7
EN

Stack Overflow用户

发布于 2012-11-02 00:36:27

尝试调用"get_Item“。

这就是索引属性是如何编译的,因为成员称为get_Item。

票数 0
EN

Stack Overflow用户

发布于 2012-11-05 21:07:21

我已经通过枚举COM对象解决了我的问题:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13156620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档