2013-08-20 39 views
1

我做這個代碼後:我要訪問選定類或接口當右鍵點擊項目,新項目添加到VS 2010

`public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) 
       {   
    _applicationObject = (DTE2)application; 
       _addInInstance = (AddIn)addInInst; 

       if(connectMode == ext_ConnectMode.ext_cm_UISetup) 
       { 
        object[] contextGUIDS = new object[] { }; 
        Commands2 commands = (Commands2)_applicationObject.Commands; 

        CommandBar SECommandBar = ((CommandBars)_applicationObject.CommandBars)["Context Menus"]; 
        CommandBarPopup SEPopUps = (CommandBarPopup)SECommandBar.Controls["Project and Solution Context Menus"]; 
        CommandBarPopup oCommandBar = (CommandBarPopup)SEPopUps.Controls["Project"]; 

        CommandBarControl oControl = (CommandBarControl) 
         oCommandBar.Controls.Add(MsoControlType.msoControlButton, 
         System.Reflection.Missing.Value, 
         System.Reflection.Missing.Value, 1, true); 
        // Set the caption of the menuitem 
        oControl.Caption = "Create Documentation"; 

        oSubMenuItemHandler = _applicationObject.Events.get_CommandBarEvents(oControl) as CommandBarEventsClass; 
        oSubMenuItemHandler.Click+=new _dispCommandBarControlEvents_ClickEventHandler(oSubMenuItemHandler_Click); 
} 

protected void oSubMenuItemHandler_Click(object CommandaBarControl,ref bool handled, ref bool cancelDefault) 
     { 
// I Want to access object of selected class or interface 
      MessageBox.Show("Test");     
     }` 

我開發添加在反映VS類的所有數據2010. 請我想訪問所選的類或接口來反映所有成員數據。 任何一個可以幫助我

回答

1

你可以得到有效Project描述here,然後獲取其ProjectItems和每個ProjectItemFileCodeModel,然後遍歷其CodeElementsKind= vsCMElementInterface得到的接口定義有

// Container for results 
List<string> classes = new List<string>(); 
List<string> interfaces = new List<string>(); 

// Get selected projects from solution explorer 
Array projects = (Array)_applicationObject.ActiveSolutionProjects; 

// Get all ProjectItems inside of the selected Projects 
var projectItems = projects 
    .OfType<Project>() 
    .Where (p => p.ProjectItems != null) 
    .SelectMany (p => p.ProjectItems.OfType<ProjectItem>().Where (pi => pi.FileCodeModel != null)); 

// Iterate over all of these ProjectItems 
foreach (ProjectItem projectItem in projectItems) 
{ 
    // Get all of the CodeElements (Interfaces and Classes) inside of the current ProjectItem (recursively) 
    var elements = projectItem.FileCodeModel.CodeElements 
     .OfType<CodeElement>() 
     .SelectMany (ce => this.GetCodeElements (ce)); 

    // Do something with the CodeElements that were found 
    classes.AddRange (elements.Where (el => el.Kind == vsCMElement.vsCMElementClass).Select (el => el.Name)); 
    interfaces.AddRange (elements.Where (el => el.Kind == vsCMElement.vsCMElementInterface).Select (el => el.Name)); 
} 


// Possible implementation of GetCodeElements: 
private IEnumerable<CodeElement> GetCodeElements (CodeElement root) 
{ 
    List<CodeElement> result = new List<CodeElement>(); 
    if (root == null) 
     return result; 

    // If the current CodeElement is an Interface or a class, add it to the results 
    if (root.Kind == vsCMElement.vsCMElementClass || root.Kind == vsCMElement.vsCMElementInterface) 
    { 
     result.Add (root); 
    } 

    // Check children recursively 
    if (root.Children != null && root.Children.Count > 0) 
    { 
     foreach (var item in root.Children.OfType<CodeElement>()) 
     { 
      result.AddRange (this.GetCodeElements (item)); 
     } 
    } 
} 
+0

我這樣做代碼:'object [] ps =(object [])_ applicationObject.ActiveSolutionProjec TS; foreach(Project pr in ps) ProjectItems _ProjectItems = pr.ProjectItems; CodeModel hh = _ProjectItems.ContainingProject.CodeModel; CodeElements els = hh.CodeElements; }'我無法訪問項目的類和接口 –

+0

我更新了我的答案和一個工作示例 –

+0

感謝斯蒂芬鮑爾它的工作原理,但我可以訪問類,並得到它的類型來做到這一點:'MethodInfo [] mi = obj.GetType ()。GetMethods();''// obj我從選定的項目得到它 –

相關問題