¿Cómo aplanar un objeto referenciado en dos propiedades json.net en el referente?

Considere la siguiente clase:

public class User
{
  public virtual int Id {get;set;}
  public virtual string Name {get;set;}
  public virtual User Superior {get;set;}
}

Mi objetivo es serializar esto como json usando newtonsofts json.net así:

{
  Id: 101,
  Name: 'Mithon',
  SuperiorId: 100,
  SuperiorName: 'TheMan'
}

¿Por qué quiero hacer esto? Porque quiero usar el Json como mi DTO sin generar una capa intermedia de objetos dinámicos. La generación de los DTO debe hacerse dinámicamente por convención en lugar de explícitamente, imho. Sé que algunos podrían estar totalmente en desacuerdo con esto, pero discutir mi enfoque no es el punto. Solo quiero saber si y como puede hacerse.

El reto es que usarJsonPropertyAttribute para la propiedad Superior solo obtendré una propiedad como salida, donde necesito dos. Si uso unJsonObjectAttribute Obtendré un atributo anidado y tendré problemas con el usuario de nivel superior que también está siendo aplanado.

Afortunadamente, parece que hay suficientes propiedades y métodos protegidos y / o públicos en la biblioteca json.net que puedo extender algo para obtener el resultado deseado. La pregunta entonces es: ¿con qué clases y métodos debo comenzar para llegar a donde quiero ir? ¿Derivar de DefaultContractResolver y reemplazar el método GetProperties sería un buen lugar, o debería buscar en otro lugar?

Respuestas a la pregunta(1)

Su respuesta a la pregunta