Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过反射调用此[int index]_C#_Reflection_Office Interop - Fatal编程技术网

C# 通过反射调用此[int index]

C# 通过反射调用此[int index],c#,reflection,office-interop,C#,Reflection,Office Interop,我尝试将基于反射的后期绑定库实现到Microsoft Office。 Offce COM对象的属性和方法按以下方式调用: Type type = Type.GetTypeFromProgID("Word.Application"); object comObject = Activator.CreateInstance(type); type.InvokeMember(<METHOD NAME>, <BINDING FLAGS>, null, comObject, new

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

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

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

如何通过反射调用Excel.Workbooks的this[int index]操作符?

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

当您有工作簿时,将获取第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).
如果类型为excel类型,则获取工作簿:

type.InvokeMember("Workbooks", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, null)
尝试调用“get_Item”


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

我通过枚举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);
}
公共工作簿此[int iIndex]
{
得到
{
int c=0;
foreach(本文档中的工作簿wb)
{
如果(c==iIndex)
返回wb;
C++;
}
返回null;
}
}
// ...
//工作簿对象是COM对象Excel.工作簿的包装器
IEnumerator IEnumerable.GetEnumerator()
{
foreach(变量对象在(IEnumerable)m_COMObject中)
收益返回obj==null?null:新工作簿(obj,this);
}
我知道这是一个令人不快的解决方案,但它是有效的。:-)


感谢您的帮助

您解决了问题,但没有正确回答问题。当有人搜索你的特定问题时,他可能会找到这个问题,但标记为正确的答案不是他正在寻找的答案。请重构您的问题/答案。您的答案解决了问题:我调用了“Item”成员,但我必须使用“InvokeMethod”BindingFlag.:-)
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);
}