3

オプション ダイアログに [デフォルトに戻す]ボタンがあり、Properties.Settings.Default 全体ではなく、このフォームでのみ影響を受ける値を復元したい

だから私は試しました:

var backup = Properties.Settings.Default;
Properties.Settings.Default.Reload();
overwriteControls();
Properties.Settings.Default = backup;

しかし、残念ながら、バックアップも で変更されているように見えるため、これは機能しませんReload()か? なぜ、どのようにこれを正しく行うのでしょうか?

4

1 に答える 1

6

Settings クラスはシングルトン パターンを使用します。つまり、一度に設定のインスタンスを 1 つだけにすることができます。したがって、そのインスタンスのコピーを作成すると、常に同じインスタンスが参照されます。

理論的には、リフレクションを使用して Settings クラスの各プロパティを反復処理し、次のように値を抽出できます。

        var propertyMap = new Dictionary<string, object>();

        // backup properties
        foreach (var propertyInfo in Properties.Settings.Default.GetType().GetProperties())
        {
            if (propertyInfo.CanRead && propertyInfo.CanWrite && propertyInfo.GetCustomAttributes(typeof(UserScopedSettingAttribute), false).Any())
            {
                var name = propertyInfo.Name;
                var value = propertyInfo.GetValue(Properties.Settings.Default, null);
                propertyMap.Add(name, value);
            }
        }

        // restore properties
        foreach (var propertyInfo in Properties.Settings.Default.GetType().GetProperties())
        {
            if (propertyInfo.CanRead && propertyInfo.CanWrite && propertyInfo.GetCustomAttributes(typeof(UserScopedSettingAttribute), false).Any())
            {
                var value = propertyMap[propertyInfo.Name];
                propertyInfo.SetValue(Properties.Settings.Default, value, null);                    
            }
        }

ただし、設定が複雑な場合は多少の作業が必要になる場合があります。戦略を再考する必要があるかもしれません。値をデフォルトに復元するのではなく、[OK] ボタンが押された後にのみ値をコミットできます。いずれにせよ、プロパティごとに各値を一時的な場所にコピーする必要があると思います。

于 2013-03-15T02:23:32.643 に答える