.NET 6 C# 配置部分变体

问题描述 投票:0回答:2

我正在使用 .NET 6 构建一个控制台应用程序。 为了加载设置,我使用选项模式,并且我想创建 json 配置文件,其中包含一组对象,这些对象的属性之一具有变化。

示例 json:

{
  "Persons": [
    {
      "Name": "Josh Wink",
      "Information": {
        "SSN": "BC00020032",
        "VatId": "100099332"
      },
      "Characteristics": {
        "Gender": "male",
        "Age": 23
      }
    },
    {
      "Name": "Peter Gabriel",
      "Information": {
        "SSN": "GH00092921",
        "VatId": "100003322"
      },
      "Characteristics": {
        "EyeColor": "brown",
        "HairColor": "black"
      }
    }
  ],
  "SomeOtherSection": "Some Value"
}

我想过为Characteristics属性使用一个空接口,但我不知道如何使用Configuration.GetSection().Bind()或Configuration.GetSection().Get来映射此部分

这是我创建的类

class PersonsCollection
{
    List<Person> Persons { get; set;} = new();
}
class Person
{
    string Name { get; set; } = String.Empty;
    PersonInfo Information { get; set; } = new();
    ICaracteristics? Characteristics { get; set; }
}
class PersonInfo
{
    string SSN { get; set; } = String.Empty;
    string VatId { get; set; } = String.Empty;
}
interface ICaracteristics
{

}
class PersonCharacteristicsType1 : ICaracteristics
{
    string Name { get; set; } = String.Empty;
    int Age { get; set; } = 0;
}
class PersonCharacteristicsType2 : ICaracteristics
{
    string EyeColor { get; set; } = String.Empty;
    string HairColor { get; set; } = String.Empty;
}
c# .net-core configurationmanager
2个回答
1
投票

您的课程存在多个问题。首先,您缺少

public
属性的访问修饰符。

辅助活页夹无法绑定您的

ICaracteristics? Characteristics
属性,因为它是一个接口,活页夹不知道如何将数据转换为它。您可以在这里引入具体的类,它将具有所有可能的属性:

class PersonsCollection
{
    public List<Person> Persons { get; set;} = new();
}
class Person
{
    public string Name { get; set; } = String.Empty;
    public PersonInfo Information { get; set; } = new();
    public Characteristics? Characteristics { get; set; }
}
class Characteristics
{
    public string Name { get; set; } = String.Empty;
    public int Age { get; set; } = 0;
    public string EyeColor { get; set; } = String.Empty;
    public string HairColor { get; set; } = String.Empty;
}

class PersonInfo
{
    public string SSN { get; set; } = String.Empty;
    public string VatId { get; set; } = String.Empty;
}

然后处理代码中的“类型”。


0
投票

如果你想保留不同的派生类,你需要在 JSON 中放置一个鉴别器,以提示序列化器要实例化哪个派生类。

请参阅此处有关此方法的文档... https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/polymorphism

© www.soinside.com 2019 - 2024. All rights reserved.