重置Json.NET契约缓存

时间:2018-04-28 08:48:24

标签: c# json caching json.net

我在我的项目中使用了一个自定义Json.NET合约解析器,它为合约模型增加了一些属性。

protected override JsonObjectContract CreateObjectContract(Type objectType)
{
    var contract = base.CreateObjectContract(objectType);
    AddSomeMorePropertiesToContract(contract, objectType);

    return contract;
}

在应用程序的生命周期中,我的模型的自定义属性列表可能会更改,某些属性可能会被删除,而某些属性可能会被添加。

然而,当第一次使用该类型并将其缓存时,Json.NET仅解析JsonObjectContracts及其属性一次,因此永远不会应用新的属性列表!

有没有办法告诉Json.NET它应该重置缓存并再次解决合同?

我发现实现此目的的唯一解决方法是在创建所有合同后存储它们,并在我想要更新它们时手动操作它们的属性:

public class MyContractResolver : CamelCasePropertyNamesContractResolver
{
    private static List<JsonObjectContract> OldContracts { get; } = new List<JsonObjectContract>();

    protected override JsonContract CreateContract(Type type)
    {
        var contract = base.CreateContract(type);
        OldContracts.Add((JsonObjectContract)contract);

        return contract;
    }

    public void UpdateContracts()
    {
        foreach (var oldContract in OldContracts)
        {
            oldContract.Properties.Clear();
            var newContract = (JsonObjectContract)base.CreateContract(oldContract.UnderlyingType);
            oldContract.Properties.AddRange(newContract.Properties);
        }
    }

这可以,但不是手动更新属性,我更愿意只是以某种方式重置缓存,让Json.NET自己再次解决契约。

0 个答案:

没有答案