2

私はほとんどそれを手に入れました、しかし私は最後の部分を優雅に行うのに苦労しています。この回答は、ジェレミー・トンプソンによって提出された回答に基づいて更新されました。これは私がこれまでに持っているものです:

public void SetupTree()
{
    var types = Assembly.Load("Data").GetTypes().Where(t => t.IsPublic && t.IsClass);

    if (types.Count() > 0)
    {
        if (treeView_left.Nodes.Count == 0)
        {
            treeView_left.Nodes.Add(new TreeNode("Structure Data"));
            treeView_left.Nodes[0].Nodes.Add(types.First().GetHashCode().ToString(), types.First().Name);
        }

        foreach (Type type in types)
        {
            BuildTree(types, type, treeView_left.Nodes[0].Nodes[0]);
        }
    }

    treeView_left.Refresh();
}

private void BuildTree(IEnumerable<Type> types, Type type, TreeNode parentNode)
{
    var tempNodes = treeView_left.Nodes.Find(type.BaseType.GetHashCode().ToString(), true);
    if (tempNodes.Count() > 0)
    {
        parentNode = tempNodes[0];
        if (tempNodes.Count() != 1)
        {
            //TODO: warning
        }
    }

    if (parentNode != null)
    {
        if (treeView_left.Nodes.Find(type.GetHashCode().ToString(), true).Count() == 0)
        {
            parentNode.Nodes.Add(type.GetHashCode().ToString(), type.Name);
        }

        foreach (Type t in types.Where(x => x.IsSubclassOf(type)))
        {
            BuildTree(types, t, parentNode.Nodes[type.GetHashCode().ToString()]);
        }
    }
}

これは私が探している結果を生み出しますが、私はこれのいくつかを困難な方法で行っているのではないかと思います。誰かが最後の部分のためのよりクリーンな方法を指摘することができれば、私はそれを適用します。

4

1 に答える 1

1

これはまだテストしていませんが、再帰LoadAllChildren呼び出し自体が呼び出されていることに注意してください。

public void SetupTree()
{
    Assembly dataLib = Assembly.Load("Data");
    TreeNode theTree = new TreeNode("Assembly Data");

    foreach (Type type in dataLib.GetTypes())
    {
        LoadAllChildren(dataLib, type, theTree);
    }

    treeView_left.Nodes.Add(theTree);  //Optimisation - bind all nodes in one go rather than adding individually
}

private void LoadAllChildren(Assembly dataLib,Type type, TreeNode parentNode)
{
    if (type.IsPublic && type.IsClass)
    {            
        TreeNode node = new TreeNode(type.Name);
        parentNode.Nodes.Add(node);           

        var types = dataLib.GetTypes().Where(x => x.IsSubclassOf(type));
        foreach (Type t in types)
        {
            LoadAllChildren(dataLib, t, node);
        }
    }
}

これでハードルを乗り越えるのに十分だと思います。お気軽にQに質問してください。

PCが再構築されようとしているので、すぐに応答しません:(

于 2013-02-28T01:26:49.990 に答える