Establecer todos los parámetros de objeto nulo en string.empty

Tengo un objeto que contiene cadenas y otros objetos que contienen cadenas, lo que necesito hacer es asegurarme de que el objeto y cualquier subobjeto tengan una cadena vacía y no un valor nulo, hasta ahora esto funciona bien:

foreach (PropertyInfo prop in contact.GetType().GetProperties())
{
    if(prop.GetValue(contact, null) == null)
    {
        prop.SetValue(contact, string.empty);
    }
}

El problema es que esto solo funciona para las cadenas de objetos y no para las cadenas de subobjetos. ¿Hay alguna manera de recorrer también todos los subobjetos y establecer sus cadenas enstring.Empty si se encuentra que esnull?

Aquí hay un ejemplo del objeto 'contacto':

new contact 
{
  a = "",
  b = "",
  c = ""
  new contact_sub1 
  {
     1 = "",
     2 = "",
     3 = ""
  },
  d = ""
}

Básicamente también necesito registrarmecontact_sub1 para nulos y reemplazar el valor con un vacíostring.

Respuestas a la pregunta(1)

Su respuesta a la pregunta