Вызов этого [int index] через отражение
Я пытаюсь внедрить библиотеку поздней привязки на основе отражения в 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.
Как я могу вызвать этот оператор [int index] Excel.Workbooks через отражение?
Ответы
Ответ 1
Возможно, я пропустил ваш вопрос, но, надеюсь, это помогает некоторым.
Это получает книгу n: th, когда у вас есть рабочая книга:
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)
Ответ 2
Попробуйте вызвать "get_Item".
Вот как скомпилированы индексированные свойства, как члены, называемые get_Item.
Ответ 3
Я решил свою проблему, перечислив 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);
}
Я знаю, что это неприятное решение, но оно работает.: -)
спасибо за помощь