none
読み取り専用なカスタムCultureInfoオブジェクトを作成する方法について RRS feed

  • 質問

  • .NET Framework2.0で曜日を表す文字を独自の物に変更した"読み取り専用"のCultureInfoオブジェクトを作成したいのですがうまくいきません。

    CultureInfo.IsReadOnlyプロパティがgetのみであることからCultureInfo.ReadOnlyメソッドを呼び出す方法を試してみました。

    CultureInfo cul = new CultureInfo("ja-JP");
    Console.WriteLine(string.Join(",",cul.DateTimeFormat.DayNames));
    // デフォルト値の
    //  日曜日,月曜日,火曜日,水曜日,木曜日,金曜日,土曜日
    // が出力されます。

    string[] dayNames = new string[7]{"にち", "げつ","か","すい","もく","きん","ど"};
    cul.DateTimeFormat.DayNames = dayNames;
    Console.WriteLine(string.Join(",",cul.DateTimeFormat.DayNames));
    // 設定した通り
    //  にち,げつ,か,すい,もく,きん,ど
    // が出力されます。

    CultureInfo rcul = CultureInfo.ReadOnly(cul);
    Console.WriteLine(string.Join(",",rcul.DateTimeFormat.DayNames));
    // なぜかデフォルト値の
    //  日曜日,月曜日,火曜日,水曜日,木曜日,金曜日,土曜日
    // が出力されます。


    CultureInfo.ReadOnlyメソッドを呼び出すとDateTimeFormat.DayNamesプロパティ以外にもMonthNamesプロパティなども全てデフォルト値に戻ってしまいます。


    なんとか読み取り専用にしたいのですがなにか良い方法はありませんでしょうか?

    2007年5月18日 2:20

すべての返信

  • CultureInfo は内部に DateTimeFormatInfo を持っています。

    DateTimeFormatInfo.ReadOnlyメソッドでもデフォルト値に戻ります。

    DateTimeFormatInfo は内部に Calender を持っています。

    DateTimeFormatInfo.ReadOnlyメソッドは、Calender.ReadOnly メソッドを使って ReadOnly な Calender を 作っていると思われます。

     

    デフォルト値に戻る理由ですがDateTimeFormatInfo.Calendar プロパティのHELPに以下のように書いてあります。

     

    このプロパティの値を変更すると、MonthNames、AbbreviatedMonthNames、DayNames、AbbreviatedDayNames、CalendarWeekRule、FirstDayOfWeek、FullDateTimePattern、LongDatePattern、ShortDatePattern、YearMonthPattern、MonthDayPattern の各プロパティにも影響を与えます。

     

    つまり、DateTimeFormatInfo.Calendar を ReadOnly な Calender に変えてしまったので影響がでたと思います。

    2007年5月22日 16:14
  • 回答ありがとうございます。
    できれば読み取り専用にすることで予想外のバグを防ぎたかったのですが、
    無理のようなので中身を書き換えてはダメというルールで対応したいと思います。
    2007年5月23日 1:21