【问题标题】:How to create a complete generic TreeView like data structure如何创建一个完整的通用 TreeView 类数据结构
【发布时间】:2011-02-26 16:14:26
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • 请您描述一下我是如何创建它的
  • 你甚至想为不同的孩子选择不同的类型?
  • 是的,我也需要不同类型的不同孩子。

标签: c# generics treeview strong-typing


【解决方案1】:

好吧,除了是一棵树之外,您还将拥有一些基础数据。例如目录树。目录的属性是它的名称和子目录的列表。我们首先定义一个通用的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&lt;string&gt;:

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

这将创建一个像这样的树:

root
|- child1
|- child2
|- child3

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

【讨论】:

  • 是的,当所有节点都具有相同的数据类型时,我知道如何创建这种树视图。但我的问题是关于如何使用不同的数据类型以及如何使其成为强类型
【解决方案2】:

阅读伊戈尔的回答和您的评论后,可以说这是不可能的。你所能做的就是使用 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;
}

但这是你能做的。

【讨论】:

    【解决方案3】:

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

    只有在编译时准确地知道树的形状,才能创建类型安全树。当然,这消除了树的所有现实世界用例。

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 2017-03-15
      • 2020-04-24
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      相关资源
      最近更新 更多