Как десериализовать объекты YAML в классы C# на основе имени ключа ⇐ C#
-
Гость
Как десериализовать объекты YAML в классы C# на основе имени ключа
Я пытаюсь использовать YamlDotNet для десериализации массива объектов в классы C# на основе ключа этих объектов.
У меня есть такой YAML:
шаги: - запуск: имя: приложение - нажмите: название: кнопка повтор: 2 - установить значение: имя: поле значение: тест А затем некоторые классы/интерфейсы C#, подобные этому:
публичный класс Runner { public IEnumerable Шаги {get; набор; } = новый список(); } общедоступный интерфейс IStep { } Запуск публичного класса: IStep { общедоступная строка Имя {get; набор; } = строка.Пусто; } публичный класс Click: IStep { общедоступная строка Имя {get; набор; } = строка.Пусто; общественный ИНТ Повторить {получить; набор; } = 1; } общедоступный класс SetValue: IStep { общедоступная строка Имя {get; набор; } = строка.Пусто; общедоступная строка Value {get; набор; } = строка.Пусто; } Используя YamlDotNet, я пытался десериализовать с помощью WithTypeDiscriminationNodeDeserializer с помощью такого десериализатора:
новый DeserializerBuilder() .WithNamingConvention(CamelCaseNamingConvention.Instance) .WithTypeDiscrimatingNodeDeserializer((options) => { Dictionary keyMappings = new() { { "запуск", typeof(Запуск) }, { "клик", typeof(Клик) }, { "setValue", typeof(SetValue) }, }; options.AddUniqueKeyTypeDiscriminator(keyMappings); }) .Строить(); Но это не удается из-за Ошибка: свойство «запуск» не найдено для типа «Models.Launch». Судя по документации для AddUniqueKeyTypeDiscriminator, это правильное поведение, поскольку в этих примерах есть свойства с именами, равными этим ключам, но я надеялся избежать этого ненужного переноса, как мне этого добиться?
Я пытаюсь использовать YamlDotNet для десериализации массива объектов в классы C# на основе ключа этих объектов.
У меня есть такой YAML:
шаги: - запуск: имя: приложение - нажмите: название: кнопка повтор: 2 - установить значение: имя: поле значение: тест А затем некоторые классы/интерфейсы C#, подобные этому:
публичный класс Runner { public IEnumerable Шаги {get; набор; } = новый список(); } общедоступный интерфейс IStep { } Запуск публичного класса: IStep { общедоступная строка Имя {get; набор; } = строка.Пусто; } публичный класс Click: IStep { общедоступная строка Имя {get; набор; } = строка.Пусто; общественный ИНТ Повторить {получить; набор; } = 1; } общедоступный класс SetValue: IStep { общедоступная строка Имя {get; набор; } = строка.Пусто; общедоступная строка Value {get; набор; } = строка.Пусто; } Используя YamlDotNet, я пытался десериализовать с помощью WithTypeDiscriminationNodeDeserializer с помощью такого десериализатора:
новый DeserializerBuilder() .WithNamingConvention(CamelCaseNamingConvention.Instance) .WithTypeDiscrimatingNodeDeserializer((options) => { Dictionary keyMappings = new() { { "запуск", typeof(Запуск) }, { "клик", typeof(Клик) }, { "setValue", typeof(SetValue) }, }; options.AddUniqueKeyTypeDiscriminator(keyMappings); }) .Строить(); Но это не удается из-за Ошибка: свойство «запуск» не найдено для типа «Models.Launch». Судя по документации для AddUniqueKeyTypeDiscriminator, это правильное поведение, поскольку в этих примерах есть свойства с именами, равными этим ключам, но я надеялся избежать этого ненужного переноса, как мне этого добиться?
Мобильная версия