Generics e arquitetura pai / filho

Estou construindo uma arquitetura comherdáve relações genéricas e pais-filhos. Tenho um grande problema: não posso conscientizar a criança e os pais do tipo um do outro, apenas um dos doi

Preciso que o filho e o pai estejam cientes do tipo um do outr

Cenário : Pai conhece o tipo filho, mas filho conhece pai genérico apenas com filhos genérico

public class Child
{
    public Parent<Child> Parent;
}

public class Parent<TChild>
    where TChild : Child
{
    public List<TChild> Children;
}

Scenario 2: O filho conhece o tipo de pai, mas o pai conhece apenas filhos genéricos com pai genéric

public class Child<TParent>
    where TParent : Parent
{
    public TParent Parent;
}

public class Parent
{
    public List<Child<Parent>> Children;
}

Scenario 3: O cenário utópico, mas inatingível:

public class Child<TParent>
    where TParent : Parent
{
    public TParent Parent;
}

public class Parent<TChild>
    where TChild : Child
{
    public List<TChild> Children;
}

Certamente, o cenário 3 não será compilado, porque Pai e Filho usam um segundo tipo genérico que seriatheir own, mas não posso (ou pelo menos não sei como!) especificar que é o seu próprio tip

Estou caindo em algum tipo de loop / recursão / arremesso infinito aqui, por favor me ajude antes de me afogar.

Boa sorte

EDITA: Se eu não estava claro, posso fazer referência aos meus tipos sim, mas se o usuário deriva de Child no FooChild e acessar os filhos do pai do FooChild, eles serão apenas Child, e não FooChild, como deveria ser.

xemplo de falha com o cenário:

public class Child
{
    public Parent<Child> Parent;
}

public class Parent<TChild>
    where TChild : Child, new()
{
    public List<TChild> Children;
}

public class FooChild : Child
{
    public int Required;

    public void Bar()
    {
        foreach (Child child in this.Parent.Children)
        {
            int x = child.Required; // cannot be accessed!
        }
    }
}

xemplo de falha com o cenário:

public class Child<TParent>
    where TParent : Parent
{
    public TParent Parent;
}

public class Parent
{
    public List<Child<Parent>> Children;
}

public class FooChild : Child<Parent>
{
    public int Required;

    public void Bar()
    {
        foreach (Child<Parent> child in this.Parent.Children)
        {
            int x = child.Required; // cannot be accessed!
        }
    }
}

questionAnswers(1)

yourAnswerToTheQuestion