我在我的项目中使用了一个自定义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自己再次解决契约。