Возможно ли иметь динамический IContractResolver? [Дубликат]

Как вы думаете, он будет работать

var ele =document.getElementsByClassName('entry')[0]
ele.removeChild(ele.lastChild)
2
задан Mark Olbert 9 June 2015 в 22:20
поделиться

1 ответ

Это кажется ошибкой с CamelCasePropertyNamesContractResolver . Его базовый класс DefaultContractResolver имеет два конструктора: конструктор без параметров и версию DefaultContractResolver (Boolean) (только что устаревшие в Json. NET 7.0). Этот параметр имеет следующее значение:

shareCache

  • Тип: System.Boolean Если установлено значение true, DefaultContractResolver будет использовать кешированный общий доступ с другими преобразователями тот же тип. Совместное использование кеша значительно улучшит производительность с помощью нескольких экземпляров resolver, потому что дорогое отражение произойдет только один раз. Этот параметр может вызвать неожиданное поведение, если разные экземпляры резольвера предполагают получение разных результатов. Если установлено значение false, настоятельно рекомендуется повторно использовать экземпляры DefaultContractResolver с помощью JsonSerializer.

По умолчанию false.

К сожалению, конструктор по умолчанию для CamelCasePropertyNamesContractResolver устанавливает значение в true:

public class CamelCasePropertyNamesContractResolver : DefaultContractResolver
{
    public CamelCasePropertyNamesContractResolver()
#pragma warning disable 612,618
        : base(true)
#pragma warning restore 612,618
    {
        NamingStrategy = new CamelCaseNamingStrategy
        {
            ProcessDictionaryKeys = true,
            OverrideSpecifiedNames = true
        };
    }
}

Кроме того, нет второго конструктора с shareCache. Это нарушает ваш SpecificFieldsResolver.

В качестве обходного пути вы можете получить свой резольвер из DefaultContractResolver и использовать CamelCaseNamingStrategy для отображения имени:

public class IndependentCamelCasePropertyNamesContractResolver : DefaultContractResolver
{
    public IndependentCamelCasePropertyNamesContractResolver()
        : base()
    {
        NamingStrategy = new CamelCaseNamingStrategy
        {
            ProcessDictionaryKeys = true,
            OverrideSpecifiedNames = true
        };
    }    
}

public class SpecificFieldsResolver : IndependentCamelCasePropertyNamesContractResolver
{
    // Remainder unchanged
}

Обратите внимание, что если вы используете версию Json.NET до 9.0, CamelCaseNamingStrategy не существует. Вместо этого вложенное kludge CamelCasePropertyNamesContractResolver можно использовать для сопоставления имен:

public class IndependentCamelCasePropertyNamesContractResolver : DefaultContractResolver
{
    class CamelCaseNameMapper : CamelCasePropertyNamesContractResolver
    {
        // Purely to make the protected method public.
        public string ToCamelCase(string propertyName)
        {
            return ResolvePropertyName(propertyName);
        }
    }
    readonly CamelCaseNameMapper nameMapper = new CamelCaseNameMapper();

    protected override string ResolvePropertyName(string propertyName)
    {
        return nameMapper.ToCamelCase(propertyName);
    }
}
6
ответ дан dbc 27 August 2018 в 16:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: