I Want to access Selected Class or Interface When Right Click to project after add in new item to vs 2010 [closed]

StackOverflow https://stackoverflow.com/questions/18335228

Question

I do this Code:

   `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");                
        }`

I'm Develop Add In to reflect all data of class in vs 2010. Please I want to access selected class or Interface to Reflect all member data. any one help me

Was it helpful?

Solution

You can get the active Project as described here, then get its ProjectItems and for each ProjectItem its FileCodeModel and then iterate over its CodeElements with Kind= vsCMElementInterface to get the Interfaces defined there

Example:

// 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 ) );
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top