我想创建一个完全通用的树视图结构。这样的事情:
public class TreeView<T, K, L>
{
public T source;
public K parent;
public List<L> children;
}
正如您在此类源代码中看到的那样,父代和子代都具有不同的通用数据类型。我也希望我的树视图具有无限数量的级别(不仅仅是3级)。这样,当我想在代码中使用我的节点时,所有这些节点都将被强类型化。不仅仅是我需要将它们转换为原始类型的对象。
是否可以在c#中创建这种结构,这是一个树形视图,其所有节点都是强类型的?
感谢
答案 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;
}
但这就是你所能做的一切。