7

我想创建一个完全通用的树视图,如结构。像这样的东西:

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

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

是否可以在 C# 中创建这种结构,它的所有节点都是强类型的树视图?

谢谢

4

3 回答 3

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

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

于 2010-06-02T06:30:33.500 回答
2

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

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

于 2010-06-08T01:24:20.313 回答
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;
}

但这就是你所能做的。

于 2010-06-02T07:15:45.033 回答