如何创建一个完整的通用TreeView数据结构

时间:2010-06-02 06:12:01

标签: c# generics treeview strong-typing

我想创建一个完全通用的树视图结构。这样的事情:

public class TreeView<T, K, L>
{
    public T source;
    public K parent;
    public List<L> children;
}

正如您在此类源代码中看到的那样,父代和子代都具有不同的通用数据类型。我也希望我的树视图具有无限数量的级别(不仅仅是3级)。这样,当我想在代码中使用我的节点时,所有这些节点都将被强类型化。不仅仅是我需要将它们转换为原始类型的对象。

是否可以在c#中创建这种结构,这是一个树形视图,其所有节点都是强类型的?

感谢

3 个答案:

答案 0 :(得分:2)

嗯,除了是一棵树,你还会有一些基础数据。例如目录树。目录的属性是其名称和子目录列表。我们首先定义通用TreeItem

public class TreeItem<T> {
  public TreeItem() {
    Children = new List<TreeItem<T>>();
  }

  public void AddChild(T data) {
    Children.Add(new TreeItem<T>{Data = data, Parent = this});
  }

  public List<TreeItem<T>> Children{get;set;}
  public TreeItem<T> Parent {get;set;}
  public T Data {get;set;}
}

因此,简单的目录树只是TreeItem<string>

var directories = new TreeItem<string> { Data="root" };
directories.AddChild("child1");
directories.AddChild("child2");
directories.AddChild("child3");

这会创建一个这样的树:

root
|- child1
|- child2
|- child3

创建完全通用的树视图的唯一方法是为当前节点,上面的节点和所有子节点提供相同的类型,否则您必须在编译时修复结构并且仅支持设置层次结构。

答案 1 :(得分:2)

这是树数据结构的一个大问题。定义同构树很容易,但在现实世界中,树通常由异构对象类型组成。一个很好的例子是文件系统,其中树包含驱动器,文件夹和文件。

如果在编译时确切知道树的形状,则只能创建类型安全树。当然,这消除了树木的每个真实世界用例。

答案 2 :(得分:1)

阅读Igors回答和你的评论后,可以说这是不可能的。您所能做的只是使用T所有类共有的基类型,如基类或接口。

但是如果您需要在代码中的某个位置使用特定类型来构建它,这可能会导致某种if-return或if-else-if结构,如:

SpecificType specType = commonType as SpecificType;
if(specType != null)
{
    //Do something...
    return;
}

AnotherSpecifcType specType2 = commonType as AnotherSpecifcType;
if(specType2 != null)
{
    //Do something...
    return;
}

但这就是你所能做的一切。