我尝试在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>});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的这个整数索引运算符?
发布于 2012-11-02 00:26:09
我可能误解了你的问题,但希望这能有所帮助。
当您有一个工作簿时,这将获得第n个工作簿:
typeof(Workbooks).GetMethod("get_Item").Invoke(excel.Workbooks, new object[] { n });不过,我想问一下,你使用的是什么版本的.NET?
否则,这可能会起作用:
typeof(Workbooks).InvokeMember("Item", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, new object[] { n });这一条(Count)也非常有用:
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-02 00:36:27
尝试调用"get_Item“。
这就是索引属性是如何编译的,因为成员称为get_Item。
发布于 2012-11-05 21:07:21
我已经通过枚举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);
}我知道这是一个令人不快的解决方案,但它是有效的。:-)
谢谢你的帮忙
https://stackoverflow.com/questions/13156620
复制相似问题