2

我正在为 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填充对象数组,但我不知道这些对象的实际类型是什么GetTypereturn System.__ComObject,这不是很有帮助。我假设这些对象实现了一个已知的接口,但我怎么知道是哪一个呢?这似乎没有记录在任何地方......目前我正在使用dynamic来访问对象的属性,但这并不理想,而且无论如何我不知道这个对象公开了哪些方法(我只能看到监视窗口中的属性)

有谁知道解决方案资源管理器中的项目项实现了哪个接口

4

1 回答 1

1

好的,看来 GetObjects 返回的项目是 type FileProperties。但无论如何,我找到了一种更简单的方法,而是使用 EnvDTE...EnvDTE.ProjectItem可以使用此方法从层次结构和项目 ID 中检索对象:

    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;
    }
于 2011-11-28T18:44:06.643 回答