如何使用默认值填充可选集合 属性?

How can I populate an optional collection property with a default value?

我正在尝试反序列化代表此 class 的 json 文件的一部分。

public class Command
{
    [JsonRequired]
    public string Name { get; set; }

    [DefaultValue("Json!")]
    public string Text { get; set; }

    //[DefaultValue(typeof(Dictionary<string, string>))]
    public Dictionary<string, string> Parameters { get; set; } = new Dictionary<string, string>();
}

其中有两个属性是可选的:TextParameters。我希望它们填充有默认值。

问题是我不知道如何让它对他们都有效。

问题:有没有办法让它适用于所有属性?

我想让它不为空,这样我就不必在代码的其他部分检查它了。


我尝试过的演示:

void Main()
{
    var json = @"
[
    {
        ""Name"": ""Hallo"",
        ""Text"": ""Json!""
    },
        {
        ""Name"": ""Hallo"",
    }
]
";

    var result = JsonConvert.DeserializeObject<Command[]>(json, new JsonSerializerSettings
    {
        DefaultValueHandling = DefaultValueHandling.Populate,
        ObjectCreationHandling = ObjectCreationHandling.Reuse
    });

    result.Dump(); // LINQPad
}

不是通过设置指定全局 DefaultValueHandling,而是使用 [JsonProperty] 属性根据需要为每个人设置 DefaultValueHandling 属性:

public class Command
{
    [JsonRequired]
    public string Name { get; set; }

    [DefaultValue("Json!")]
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
    public string Text { get; set; }

    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
    public Dictionary<string, string> Parameters { get; set; } = new Dictionary<string, string>();
}

然后,像这样反序列化:

var result = JsonConvert.DeserializeObject<Command[]>(json);