Desserializando a matriz JSON heterogênea em Lista covariante <> usando JSON.NET

Eu tenho uma matriz JSON contendo objetos de diferentes tipos com propriedades diferentes. Uma das propriedades é chamada "type" e determina o tipo do item da matriz. Aqui está um exemplo dos meus dados:

   [{
        type : "comment",
        text : "xxxx"
    }, {
        type : "code",
        tokens : [{
                type : "ref",
                data : "m"
            }, {
                type : "operator",
                data : "e"
            }
        ]
    }, {
        type : "for",
        boundLocal : {
            type : "local",
            name : "i",
            kind : "Number"
        },
        upperBound : {
            type : "ref",
            tokens : [{
                    type : "operator",
                    data : "3"
                }, {
                    type : "operator",
                    data : "0"
                }
            ]
        },
        body : [{
                type : "code",
                tokens : [{
                        type : "ref",
                        data : "x"
                    }
                ]
            }, {
                type : "code",
                tokens : [{
                        type : "ref",
                        data : "y"
                    }
                }
                ]
        ]
    ]

Para mapear esses objetos para minha implementação .Net, defino um conjunto de classes: uma classe base e várias classes filho (com uma hierarquia complexa, com 4 "gerações"). Aqui está apenas um pequeno exemplo dessas classes:

public abstract class TExpression
{
    [JsonProperty("type")]
    public string Type { get; set; }
}

public class TComment : TExpression
{
    [JsonProperty("text")]
    public string Text { get; set; }
}   

public class TTokenSequence : TExpression
{
    [JsonProperty("tokens")]
    public List<TToken> Tokens { get; set; }
}

O que eu quero alcançar é ser capaz de desserializar esse array em uma lista genérica covariante, declarada como:

List<TExpression> myexpressions = JsonConvert.DeserializeObject<List<TExpression>>(aststring);

Esta lista deve conter as instâncias de classes filho apropriadas herdadas de TExpression, para que eu possa usar o seguinte código posteriormente no meu código:

foreach(TExpression t in myexpressions)
{
    if (t is TComment) dosomething;
    if (t is TTokenSequence) dosomethingelse;
}

Como posso alcançá-lo usando JSON.NET

questionAnswers(3)

yourAnswerToTheQuestion