我正在使用 .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;
}
您的课程存在多个问题。首先,您缺少
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;
}
然后处理代码中的“类型”。
如果你想保留不同的派生类,你需要在 JSON 中放置一个鉴别器,以提示序列化器要实例化哪个派生类。
请参阅此处有关此方法的文档... https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/polymorphism