Два других ответа на момент написания статьи верны, но они упускают важную возможность объяснить, как выглядит поздняя привязка COM-объекта с точки зрения системы типов .NET. Когда вы вызываете GetType
для COM-объекта, возвращаемое значение имеет внутренний тип __ComObject
, а не тип интерфейса COM, с которым вы обычно работаете при написании кода взаимодействия. Это можно увидеть в отладчике.или с некоторым кодом, например Console.WriteLine(o.GetType().Name);
.
Тип __ComObject
не имеет свойств;вот почему вы получаете пустой массив при вызове o.GetType().GetProperties()
.(По крайней мере, некоторые вещи в жизни имеют смысл!)
Если вы декомпилируете метод InvokeMember
, вы обнаружите, что он имеет специальную обработку для объектов COM, делегируя вызов внутреннему собственному методу.Для «обычных» объектов .NET метод использует «обычное» отражение .NET, извлекая соответствующий MemberInfo
для запрошенного члена и вызывая его.
Вы можете использовать .NETотражение на интерфейсе типа.Например, если вы знаете, что объект является Excel Worksheet
, вы можете использовать typeof(Worksheet).GetProperties()
и использовать полученные экземпляры PropertyInfo
с вашим объектом.Если вы не знаете тип объекта во время компиляции, вам нужно вызвать GetType()
, как в вашем примере кода.В этом случае вы застряли с использованием InvokeMember
.