ISelectionContainer.GetObjects返回的对象的类型是什么?

时间:2011-11-27 20:53:06

标签: .net visual-studio-2010 vsix

我正在为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来访问对象的属性,但它并不理想,无论如何我不知道这个对象暴露了哪些方法(我只能在Watch窗口中看到属性)

有没有人知道哪个界面是由解决方案资源管理器中的项目项实现的?

1 个答案:

答案 0 :(得分:1)

好的,似乎GetObjects返回的项目类型为FileProperties。但无论如何,我找到了一个更简单的方法,使用EnvDTE代替...使用此方法可以从层次结构和项目ID中检索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;
    }