Json.NET deserializa o serializa propiedades de cadena y mapeo json a diferentes nombres de propiedades definidos en tiempo de ejecución

Tengo la siguiente cadena JSON:

{
    "values": {
        "details": {
            "property1": "94",
            "property2": "47",
            "property3": "32",
            "property4": 1
        },
        count: 4
    }
}     

Voy a asignar esto al siguiente modelo:

public class Details
{
    public string property1 { get; set; }
    public string property2 { get; set; }
    public string property3 { get; set; }
    public int property4 { get; set; }
}

public class Values
{
    public Details details { get; set; }
    public int count { get; set; }
}

public class RootObject
{
    public Values values { get; set; }
}

Quiero poder asignar estos nombres de propiedad a diferentes nombres en tiempo de ejecución al deserializar esta cadena JSON como esta:

JsonConvert.DeserializeObject<RootObject>(jsonString);

Por ejemplo, en el proceso de deserialización, quiero que deserialice el nombre de "propiedad1" a "differen_property_name1" o "differen_property_name2" o "differen_property_name3". PorqueEstoy eligiendo el nuevo nombre en tiempo de ejecución (el nuevo nombre al que cambiaré el nombre de "propiedad1"), no puedo usar la solución usando JsonPropertyAttribute, como se sugiere aquí:

.NET NewtonSoft JSON deserializa el mapa a un nombre de propiedad diferente

Una de las respuestas de la pregunta anterior (la respuesta de Jack) usa la herencia de DefaultContractResolver pero no parece funcionar en ese caso.

Actualizar

Más tarde, necesitaba serializar el objeto que obtuve de la deserialización y asignar las propiedades a diferentes nombres de propiedades, definidos en tiempo de ejecución. Usé el mismo método que Brian propuso para hacer la serialización:

Usé el diccionario para asignar mis nuevos nombres de propiedad:

var map = new Dictionary<Type, Dictionary<string, string>>
{
    { 
        typeof(Details), 
        new Dictionary<string, string>
        {
            {"property1", "myNewPropertyName1"},
            {"property2", "myNewPropertyName2"},
            {"property3", "myNewPropertyName3"},
            {"property4", "myNewPropertyName4"}
        }
    }
};    

y luego utilicé DynamicMappingResolver de Brian para serializar el objeto de esta manera:

var settings = new JsonSerializerSettings
{
    ContractResolver = new DynamicMappingResolver(map)
};

var root = JsonConvert.SerializeObject(myObjectInstance, settings);            

Respuestas a la pregunta(4)

Su respuesta a la pregunta