Я хочу создать абсолютно универсальный treeview как структура. некоторая вещь как это:
public class TreeView<T, K, L>
{
public T source;
public K parent;
public List<L> children;
}
как Вы видите в этом источнике класса, родителе и также детях, у всех есть различный универсальный тип данных. также я хочу, чтобы мой структурный вид имел неограниченное количество уровней (не всего 3). этот путь, когда я хочу работать со своими узлами в коде, все они будут со строгим контролем типов. не только возражает, что я должен преобразовать их в их исходный тип.
действительно ли возможно создать этот вид структуры в c#, treeview, который все его узлы со строгим контролем типов?
спасибо
Это большая проблема с древовидными структурами данных. Легко определить однородные деревья, но в реальном мире деревья часто состоят из разнородных типов объектов. Хорошим примером этого является файловая система, где дерево содержит диски, папки и файлы.
Вы можете создать дерево, безопасное для типов, только если вы точно знаете форму дерева во время компиляции. Конечно, это исключает все реальные случаи использования деревьев в реальном мире.
Что ж, помимо дерева, у вас будут некоторые базовые данные. Например, дерево каталогов. Атрибуты каталога - это его имя и список дочерних каталогов. Начнем с определения общего 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
:
var directories = new TreeItem<string> { Data="root" };
directories.AddChild("child1");
directories.AddChild("child2");
directories.AddChild("child3");
Это приведет к созданию такого дерева:
root
|- child1
|- child2
|- child3
Единственный способ создать полностью общее древовидное представление - это иметь одинаковые типы для текущего узла, узла выше и всех дочерних узлов, в противном случае вам придется исправить структуру во время компиляции и поддерживать только заданную иерархию.
Прочитав ответ Игоря и ваш комментарий, я могу просто сказать, что это невозможно. Все, что вы можете сделать, это использовать в качестве 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;
}
Но это все, что вы можете сделать .