我正在为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窗口中看到属性)
有没有人知道哪个界面是由解决方案资源管理器中的项目项实现的?
答案 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;
}