protected string Generate()
        {
            var resultBuilder = new StringBuilder();

            var graph = new QuickGraph.AdjacencyGraph <Type, QuickGraph.Edge <Type> >(false);

            graph.AddVertexRange(_types);

            var typeDefinitions = new Dictionary <Type, String>();

            resultBuilder.AppendLine(this._options.NamespaceDefinitionExpression(this._options.NamespaceVarName));
            resultBuilder.AppendLine();

            GenerateTypeDefinitions(this._options.NamespaceVarName, graph, typeDefinitions);

            foreach (var type in graph.TopologicalSort().Reverse())
            {
                string definition;
                if (typeDefinitions.TryGetValue(type, out definition))
                {
                    resultBuilder.Append(definition);
                }
                else if (false == type.Assembly.Equals(Assembly.GetAssembly(typeof(string))))
                {
                    resultBuilder.AppendLine("// unknown: " + type.Name + Environment.NewLine);
                }
            }

            return(resultBuilder.ToString());
        }