Какого типа объекты возвращаются ISelectionContainer.GetObjects? - PullRequest
2 голосов
/ 28 ноября 2011

Я пишу расширение для VS2010, и мой пакет реализует IVsSelectionEvents для отслеживания выбора в обозревателе решений:

    public int OnSelectionChanged(
        IVsHierarchy pHierOld,
        uint itemidOld,
        IVsMultiItemSelect pMISOld,
        ISelectionContainer pSCOld,
        IVsHierarchy pHierNew,
        uint itemidNew,
        IVsMultiItemSelect pMISNew,
        ISelectionContainer pSCNew)
    {
        if (pSCNew != null)
        {
            uint count;
            pSCNew.CountObjects((uint) Constants.GETOBJS_SELECTED, out count);
            object[] selectedObjects = new object[count];
            pSCNew.GetObjects((uint) Constants.GETOBJS_SELECTED, count, selectedObjects);

            // What is the type of this object?
            var selectedItem = selectedObjects[0] as ???;

        }
        return VSConstants.S_OK;
    }

GetObjects заполняет массив объектов, но Я не знаю, каков фактический тип этих объектов .GetType возвращает System.__ComObject, что не очень полезно.Я предполагаю, что эти объекты реализуют известный интерфейс, но как узнать, какой?Кажется, это нигде не задокументировано ... В настоящее время я использую dynamic для доступа к свойствам объекта, но это не идеально, и в любом случае я не знаю, какие методы предоставляются этим объектом (я могусм. только свойства в окне просмотра)

Кто-нибудь знает , какой интерфейс реализован элементами проекта в обозревателе решений ?

1 Ответ

1 голос
/ 28 ноября 2011

ОК, похоже, что элементы, возвращаемые GetObjects, имеют тип FileProperties.Но в любом случае я нашел гораздо более простой подход, используя вместо этого EnvDTE ... Объект EnvDTE.ProjectItem можно извлечь из иерархии и идентификатора элемента следующим способом:

    private static ProjectItem GetProjectItem(IVsHierarchy hierarchy, uint itemId)
    {
        object o;
        if (hierarchy.GetProperty(itemId, (int)__VSHPROPID.VSHPROPID_ExtObject, out o) == VSConstants.S_OK)
        {
            return o as ProjectItem;
        }
        return null;
    }
...