Подтвердить что ты не робот

Вызов этого [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 через отражение?

4b9b3361

Ответ 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);
}

Я знаю, что это неприятное решение, но оно работает.: -)

спасибо за помощь