Reflection C# Tutorial

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Reflection;
using System.Text;
  public class Form1 : System.Windows.Forms.Form
  {
        private System.Windows.Forms.MainMenu mainMenu1  = new System.Windows.Forms.MainMenu();
        private System.Windows.Forms.MenuItem menuItem1 = new System.Windows.Forms.MenuItem();
        private System.Windows.Forms.MenuItem mnuOpen = new System.Windows.Forms.MenuItem();
        private System.Windows.Forms.OpenFileDialog openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
        private Assembly mAssembly;
        private System.Windows.Forms.TreeView carAssembly = new System.Windows.Forms.TreeView();
        private System.Windows.Forms.PropertyGrid pgObject = new System.Windows.Forms.PropertyGrid();
    public Form1()
    {
            this.SuspendLayout();
            this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {this.menuItem1});
            this.menuItem1.Index = 0;
            this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {this.mnuOpen});
            this.menuItem1.Text = "&File";
            this.mnuOpen.Index = 0;
            this.mnuOpen.Text = "&Open";
            this.mnuOpen.Click += new System.EventHandler(this.mnuOpen_Click);
            this.openFileDialog1.CheckFileExists = false;
            this.openFileDialog1.CheckPathExists = false;
            this.openFileDialog1.Filter = "Assemblies|*.exe;*.dll";
            this.openFileDialog1.ValidateNames = false;
            this.carAssembly.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
            this.carAssembly.ImageIndex = -1;
            this.carAssembly.Location = new System.Drawing.Point(8, 8);
            this.carAssembly.Name = "carAssembly";
            this.carAssembly.SelectedImageIndex = -1;
            this.carAssembly.Size = new System.Drawing.Size(672, 400);
            this.carAssembly.TabIndex = 0;
            this.carAssembly.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.carAssembly_AfterSelect);
            this.pgObject.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right)));
            this.pgObject.BackColor = System.Drawing.Color.Gray;
            this.pgObject.CommandsBackColor = System.Drawing.Color.Gray;
            this.pgObject.CommandsForeColor = System.Drawing.Color.Gray;
            this.pgObject.CommandsVisibleIfAvailable = true;
            this.pgObject.HelpBackColor = System.Drawing.Color.Gray;
            this.pgObject.HelpForeColor = System.Drawing.Color.White;
            this.pgObject.HelpVisible = false;
            this.pgObject.LargeButtons = false;
            this.pgObject.LineColor = System.Drawing.Color.Gray;
            this.pgObject.Location = new System.Drawing.Point(8, 416);
            this.pgObject.Name = "pgObject";
            this.pgObject.Size = new System.Drawing.Size(672, 128);
            this.pgObject.TabIndex = 1;
            this.pgObject.Text = "propertyGrid1";
            this.pgObject.ToolbarVisible = false;
            this.pgObject.ViewBackColor = System.Drawing.Color.Gray;
            this.pgObject.ViewForeColor = System.Drawing.Color.White;
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(688, 553);
            this.Controls.Add(this.pgObject);
            this.Controls.Add(this.carAssembly);
            this.Menu = this.mainMenu1;
            this.Text = "Assembly Viewer";
            this.ResumeLayout(false);
        }
    [STAThread]
    static void Main() 
    {
      Application.Run(new Form1());
    }
        private void mnuOpen_Click(object sender, System.EventArgs e)
        {
            if( openFileDialog1.ShowDialog(this) == DialogResult.OK )
            {
                try
                {
                    mAssembly = Assembly.LoadFile( openFileDialog1.FileName );
                    PopulateTree();
                }
                catch( Exception ex )
                {
                    MessageBox.Show( ex.Message ); 
                }
            }
        }
        private void PopulateTree()
        {
            TreeNode newNode = new TreeNode( mAssembly.GetName().Name );
            newNode.Tag = mAssembly;
            carAssembly.Nodes.Add( newNode );
            foreach( Module mod in mAssembly.GetModules() )
            {
                AddModule( mod, newNode );
            }
        }
        private void AddModule( Module mod, TreeNode parent )
        {
            TreeNode newNode = new TreeNode( mod.Name );
            newNode.Tag = mod;
            parent.Nodes.Add( newNode );
            foreach( Type t in mod.GetTypes() )
            {
                AddType( t, newNode );
            }
        }
        private void AddType( Type t, TreeNode parent )
        {
            TreeNode newNode = new TreeNode( t.Name );
            newNode.Tag = t;
            TreeNode curType;
            TreeNode curMember;
            curType = new TreeNode( "Constructors" );
            foreach( ConstructorInfo constructor in t.GetConstructors() )
            {
                curMember = new TreeNode( constructor.Name );
                curMember.Tag = constructor;
                curType.Nodes.Add( curMember );
            }
            newNode.Nodes.Add( curType );
            curType = new TreeNode( "Methods" );
            foreach( MethodInfo method in t.GetMethods() )
            {
                string methodString = method.Name + "( ";
                int count = method.GetParameters().Length;
                foreach( ParameterInfo param in method.GetParameters() )
                {
                    methodString += param.ParameterType;
                    if( param.Position < count-1 )
                        methodString += ", ";
                }
                methodString += " )";
                curMember = new TreeNode( methodString );
                curMember.Tag = method;
                curType.Nodes.Add( curMember );
            }
            newNode.Nodes.Add( curType );
            curType = new TreeNode( "Properties" );
            foreach( PropertyInfo property in t.GetProperties() )
            {
                curMember = new TreeNode( property.Name );
                curMember.Tag = property;
                curType.Nodes.Add( curMember );
            }
            newNode.Nodes.Add( curType );
            curType = new TreeNode( "Fields" );
            foreach( FieldInfo field in t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.GetField) )
            {
                string fieldInfo = field.FieldType.Name;
                fieldInfo += " " + field.Name;
                curMember = new TreeNode( fieldInfo );
                curMember.Tag = field;
                curType.Nodes.Add( curMember );
            }
            newNode.Nodes.Add( curType );
            curType = new TreeNode( "Events" );
            foreach( EventInfo curEvent in t.GetEvents() )
            {
                string eventInfo = curEvent.Name;
                eventInfo += " Delegate Type=" + curEvent.EventHandlerType;
                curMember = new TreeNode( eventInfo );
                curMember.Tag = curEvent;
                curType.Nodes.Add( curMember );
            }
            newNode.Nodes.Add( curType );
            parent.Nodes.Add( newNode );
        }
        private void carAssembly_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
        {
            if( e.Node.Tag != null )
            {
                pgObject.SelectedObject = e.Node.Tag;
            }
            else
            {
                pgObject.SelectedObject = null;
            }
        }
  }