#nullable enable using System; using Newtonsoft.Json; namespace BTCPayServer.Services { public interface ISettingsAccessor { T Settings { get; } } abstract class SettingsAccessor { public abstract void SetSetting(object? setting); } class SettingsAccessor : SettingsAccessor, ISettingsAccessor where T : class, new() { T? _settings; public T Settings => _settings ?? throw new InvalidOperationException($"Settings {typeof(T)} not yet initialized"); private T Clone(T settings) { return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(settings))!; } public override void SetSetting(object? setting) { _settings = setting is not null ? Clone((T)setting) : new T(); } } }