При попытке вызвать функцию IConfiguration.Get() результат всегда равен нулю

#c# #configuration

#c# #конфигурация

Вопрос:

У меня возникает странная проблема при попытке использовать конфигурацию значков. Мой код выглядит следующим образом:

 public class testconfigtests {  public void DoTest()  {   var testClass = new TestClass()  {  Name = "hello"   };   var config = new Dictionarylt;string, stringgt;()  {  { "Section1:section2", JsonSerializer.Serialize(testClass) }  };   var configuration = new ConfigurationBuilder()  .AddInMemoryCollection(config)  .Build();   var testConfig = new GetTestClassConfiglt;TestClassgt;();  var c = testConfig.GetTestAsync(configuration);  // c is always null  } }  public class TestClass {  public string Name { get; set; } }  public class GetTestClassConfiglt;Tgt; {  public T GetTestAsync(IConfiguration configuration)  {  var section = configuration.GetSection("Section1:section2");  return section.Getlt;Tgt;();  }  }  

Проблема, которая result у меня есть, всегда равна нулю. Насколько я понимаю, config.Getlt;gt; вернет сериализованную версию класса, но она просто возвращает значение null.

Ответ №1:

Когда вы используете AddInMemoryCollection, он не использует десериализацию JSON. Как следует из названия метода, это просто коллекция. Посмотрите, как выглядит структура конфигурации, когда вы ее используете.

введите описание изображения здесь

Теперь сравните структуру конфигурации, когда вы фактически используете метод, поддерживающий построение из JSON.

 public class Program {  static void Main(string[] args)  {  var testClass = new TestClass()  {  Name = "hello"   };   var configJson = new Dictionarylt;string, objectgt;()  {  { "Section1:section2", testClass }  };   var configurationJson = new ConfigurationBuilder()  .AddJsonStream(new MemoryStream(Encoding.ASCII.GetBytes(JsonSerializer.Serialize(configJson))))  .Build();   var testConfig = new GetTestClassConfiglt;TestClassgt;();  var c = testConfig.GetTestAsync(configurationJson);    Console.WriteLine("Result: "   c.Name);  } }  public class TestClass {  public string Name { get; set; } }  public class GetTestClassConfiglt;Tgt; {  public T GetTestAsync(IConfiguration configuration)  {  IConfigurationSection section = configuration.GetSection("Section1:section2");  return section.Getlt;Tgt;();  }  }  

введите описание изображения здесь

Как вы можете видеть, структура конфигурации теперь фактически содержит ключи с полями из вашего класса.

Комментарии:

1. Изменение этого, похоже, не имеет никакого значения — результат все равно возвращается как ноль

2. Я отредактировал код, попробуйте, может быть, полный и проверьте результат