自定义默认值取决于使用 Newtonsoft 的 PC

Custom DefaultValue depending on the PC using Newtonsoft

我有一个 JSON 配置值,它可能会因处理器数量、内存大小、OS 等因素而有所不同。

这个值本身可以在运行时很容易地计算出来,所以我不希望我的用户在他们自己的配置中有一个条目。
但在某些边缘情况下,用户可以有自己的价值,(用于测试或负载等)。

我可以设置一个默认值,但是 'default' 对所有机器都不一样:

...

[DefaultValue(8)]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
public int EventsPerProcessor { get; protected set; }

...

有没有办法知道该值是否丢失,以便我可以计算出正确的 'default' 值?

或者类似 [DefaultValue(MyCustomFunction(...) )]?

注意:当然,我可以将我的默认值设置为 0,(甚至 -ve),但我宁愿不假设用户是否输入了该值。

因为 DefaultValueHandling.Populate 的唯一效果是

Members with a default value but no JSON will be set to their default value when deserializing.

您可以完全删除 [DefaultValue(...)]DefaultValueHandling,而是在 class 构造函数中初始化 EventsPerProcessor

public class RootObject
{
    static int CalculateDefaultEventsPerProcessor()
    {
        // Replace with calculated value
        return 12;
    }

    public RootObject()
    {
        EventsPerProcessor = CalculateDefaultEventsPerProcessor();
    }

    [JsonProperty]
    public int EventsPerProcessor { get; protected set; }
}

如果JSON中没有"EventsPerProcessor",构造函数中计算的值将保持不变。

请注意,由于EventsPerProcessor已受保护setter,因此仍然需要申请[JsonProperty]

示例 fiddle here.