0

新しいアプリケーションの作成を開始しようとしており、設定の保存方法を整理したいと考えていました。独自の設定システムを作成することも検討しましたが、.NET が提供するビルドアプリケーションの設定を完全にテストする必要があると判断しました。だから私はそれについて読んで、いくつかのテストコードを作成しました。うまくいきました。私が望んでいた主なことは、簡単にできる値をリセットする方法でしたが、リセットを設定ファイルに自動的に保存せずにこれを行いたかったのです。

そこで、設定クラスの各プロパティをループし、デフォルト値を使用して現在の値を更新する次のコードを作成します。

        foreach (SettingsProperty sp in Settings.Default.Properties)
        {
            PropertyInfo propertyInfo = Settings.Default.GetType().GetProperty(sp.Name);

            if (propertyInfo.CanWrite)
            {
                // Either convert from a string or de-serialize from XML
                object value;
                switch (sp.SerializeAs)
                {
                    case SettingsSerializeAs.String:
                        TypeConverter converter = TypeDescriptor.GetConverter(sp.PropertyType);
                        value = converter.ConvertFromInvariantString(sp.DefaultValue.ToString());
                        break;
                    case SettingsSerializeAs.Xml:
                        XmlSerializer serializer = new XmlSerializer(sp.PropertyType);
                        StringReader reader = new StringReader(sp.DefaultValue.ToString());
                        value = serializer.Deserialize(reader);
                        break;
                    default:
                        throw new FormatException(
                            string.Format(
                                Resources.ExceptionResetNoSaveSerializeAsInvalid,
                                sp.SerializeAs));
                }

                propertyInfo.SetValue(Settings.Default, value, null);
            }
        }

switch文字列から変換するためのコードなしで始めました。私の最初の試みはこれを使用していました: converter.ConvertFromString. これは、プレーン テキストと GUID 値だけでも問題なく機能しましたが、日付では失敗しました。
(シリアル化されたコンテンツも機能するように追加した XML 部分ですが、それはこの質問の焦点では​​ありません)

オリジナルconverter.ConvertFromStringは日付に失敗しました。私のテストでは、「31/08/2012 11:25」を使用していました。私は Settings.Designer.cs ファイルを見て、デフォルト値がどこにどのように保存されているかを確認していましたが、これが上記の日付のデフォルトを保存する方法であることに気付きました。

    [global::System.Configuration.DefaultSettingValueAttribute("08/31/2012 11:25:15")]

私はオンラインで検索してきましたが、Visual Studio 2010 デザイナーで dd/mm/yyyy 形式を入力すると、自動生成コードで mm/dd/yyyy 形式が使用される理由を説明する参照が見つかりません。

上記の例でわかるように、使用できることがわかりconverter.ConvertFromInvariantString、日付エラーはなくなりましたが、違いを説明するドキュメントがあるかどうかを知りたい. 他の誰かがこれに出くわしましたか?

4

1 に答える 1

0

はいといいえ。内部ではインバリアント カルチャが使用されます。それは特定の文化ですが、明らかに本当の文化ではありません。

内部的には、TypeConverter.ConvertToInvariantStringやのようなメソッドを使用TypeConverter.ConvertFromInvariantStringして、文字列の内外で値を取得します。これが、文字列の mm/dd/yyy の理由です。UI に日付/時刻を入力すると、ローカル カルチャが何であるかが認識され、そのカルチャに適した形式で受け入れられます。次に、保存時に不変式に「変換」します。これは、値を読み取るときにどのカルチャが設定されるかわからないためです。それは特定の一貫したカルチャであるため、デフォルトは不変です。

に関して言えばDateTime、これは UTC にもローカルの日付/時刻にもなりません。これにより、UTC またはローカルの日付/時刻の値を格納できます。DateTime特定の Kind プロパティを必要な値に設定してオブジェクトに「変換」する必要があります。日付/時刻の値を UTC で保存することをお勧めします...

于 2012-08-11T20:19:36.513 に答える