Genéricos y arquitectura padre / hijo

Estoy construyendo una arquitectura conheredabl genéricos y relaciones entre padres e hijos. Tengo un problema importante: no puedo hacer que tanto el niño como el padre conozcan el tipo del otro, solo uno de los dos.

Necesito que tanto el niño como el padre sean conscientes del tipo del otro.

Escenario : El padre conoce el tipo de hijo, pero el hijo solo conoce al padre genérico con hijos genéricos.

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

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

Scenario 2: El niño conoce el tipo de padre, pero el padre solo conoce a los niños genéricos con el padre genérico.

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

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

Scenario 3: El escenario utópico pero inalcanzable:

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

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

Por supuesto, el escenario 3 no se compilará, porque Parent and Child toman un segundo tipo genérico que seríasu propio type, pero no puedo (¡o al menos no sé cómo!) especificar que es su propio tipo.

Estoy cayendo en una especie de bucle infinito / recursión / lanzamiento de pelota aquí, por favor, ayúdenme antes de ahogarme.

Buena suerte

EDITA: Si no estaba claro, puedo hacer referencia a mis tipos sí, pero si el usuario deriva Child en FooChild y accede a los hijos de los padres de FooChild, estos solo serán Child, y no FooChild, como debería ser. @

Failure Example with Scenario 1:

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!
        }
    }
}

Failure Example with Scenario 2:

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!
        }
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta