C# обратная навигация с типами c - PullRequest
1 голос
/ 27 апреля 2020

Мои классы похожи на эти:

public class Root<TChild> 
{
   int ID {get;}
   ...
   List<TChild> Children {get;}
}
public class Child
{
    int IDChild {get;}
    ...
}

Мне нужно добавить свойство обратной навигации в классе Child, чтобы получить от Child его Root, но я не знаю, как объявите свойство типа Root.

Какой тип должен быть TChild в дочернем классе?

Я надеюсь, что вопрос ясен, Спасибо за поддержку.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Это нормально работает, и проблема в том, что у вас есть два класса для одной и той же записи, лучше используйте один класс для каждой записи в дереве.

    public class TreeEntity
    {
        private int id = 0;
        private TreeEntity parent = null;
        private IList<TreeEntity> childs = new List<TreeEntity>();

        public TreeEntity(int id)
        {
            this.id = id;
        }

        public void AddChild(TreeEntity child)
        {
            childs.Add(child);
            child.parent = this;
        }
    }

или, возможно,

    public class TreeEntity<T>
    {
        private int id = 0;
        private TreeEntity<T> parent = null;
        private IList<TreeEntity<T>> childs = new List<TreeEntity<T>>();
        private T data = null;

        public TreeEntity(int id, T data)
        {
            this.id = id;
            this.data = data;
        }

        public void AddChild(TreeEntity<T> child)
        {
            childs.Add(child);
            child.parent = this;
        }
    }

, однако в ваш случай

public class Root<TChild> 
{
   int ID {get;}
   ...
   List<TChild> Children {get;}
   ...
   public void addChild(T child)
   {
   Children.add(child)
   child.setParent(this) 
   }
}
public class Child
{
    int IDChild {get;}
    Root<Child> parent;
    ...
    public void setParent (Root<Child>)  
    {
     this.parent = parent;
    }
}
0 голосов
/ 27 апреля 2020

Я попробовал это. net скрипка и, кажется, работает просто отлично

public class Root<TChild> 
{
   int ID {get;}
   List<TChild> Children { get; set; }
}

public class Child
{
    int IDChild {get;}
    Root<Child> MyRoot { get; set; }
}

// wherever
var root = new Root<Child> { Children = new List<Child>() };
root.Children.Add(new Child { MyRoot = root });
...