public void AddNode( TypeDescriptor node )
        {
            if( !myDescriptors.ContainsKey( node.Id ) )
            {
                myDescriptors.Add( node.Id, node );
            }

            myGraphBuilder.TryAddNode( node.Id );
        }
        public void AddEdge( TypeDescriptor source, TypeDescriptor target )
        {
            if( !myDescriptors.ContainsKey( source.Id ) )
            {
                myDescriptors.Add( source.Id, source );
            }

            if( !myDescriptors.ContainsKey( target.Id ) )
            {
                myDescriptors.Add( target.Id, target );
            }

            myGraphBuilder.TryAddEdge( source.Id, target.Id );
        }
        private void ProcessType( Type type )
        {
            if( type.Namespace == null )
            {
                // some .net internal implementation detail ...
                return;
            }

            if( IgnoreType( type ) )
            {
                return;
            }

            var name = type.Name;
            var typeDesc = new TypeDescriptor( type );
            myBuilder.TryAddNode( typeDesc.Id );
            myIdToTypeMap[ typeDesc.Id ] = typeDesc;

            if( type.BaseType != null && !IsPrimitive( type.BaseType ) && !IgnoreType( type.BaseType ) )
            {
                var baseDesc = new TypeDescriptor( type.BaseType );

                var edge = myBuilder.TryAddEdge( typeDesc.Id, baseDesc.Id );
                myIdToTypeMap[ baseDesc.Id ] = baseDesc;
                myEdgeTypes.Add( edge.Id, EdgeType.DerivesFrom );
            }

            var interfaces = type.GetInterfaces();
            if( type.BaseType != null )
            {
                interfaces = interfaces.Except( type.BaseType.GetInterfaces() ).ToArray();
            }
            foreach( var iface in interfaces )
            {
                if( IgnoreType( iface ) )
                {
                    continue;
                }

                var ifaceDesc = new TypeDescriptor( iface );

                var edge = myBuilder.TryAddEdge( typeDesc.Id, ifaceDesc.Id );
                myIdToTypeMap[ ifaceDesc.Id ] = ifaceDesc;
                myEdgeTypes.Add( edge.Id, EdgeType.Implements );
            }
        }