.net – 全局覆盖特定文化的所有实例的MonthNames

所以,我有这个问题,微软实际上得到了格陵兰文化(kl-GL)的月份名称错误.我也知道我可以将自己的字符串数组传递给DateTimeFormatInfo.MonthNames属性,但似乎我指定的值仅用于该一个CultureInfo实例的范围.有没有办法告诉.Net,每次我有一个kl-GL文化的实例时,应该使用这些特定的月份名?

我知道您可以创建特定于用户的文化,但我无法访问某些遗留代码来实际更改代码以使用我自己的用户指定文化.

解决方法

干得好

public static void RenameMonthNames(string cultureName,string[] newNames)
    {
        RenameMonthNames(cultureName,newNames,false);
        RenameMonthNames(cultureName,true);
    }


    public static void RenameMonthNames(string cultureName,string[] newNames,bool custom)
    {
        var nonPublicAndInstance = BindingFlags.NonPublic | BindingFlags.Instance;

        var culture = new CultureInfo(cultureName,custom);

        int calendarId = (int)typeof (System.Globalization.Calendar).GetProperty("ID",nonPublicAndInstance).GetValue(culture.Calendar,new object[0]);

        object cultureData = culture.GetType().GetField("m_cultureData",nonPublicAndInstance).GetValue(culture);

        cultureData.GetType().GetField("bUseOverrides",nonPublicAndInstance).SetValue(cultureData,false); // Magic hack!!!

        object calendarData = cultureData.GetType().GetMethod("GetCalendar",nonPublicAndInstance).Invoke(cultureData,new object[] { calendarId });

        calendarData.GetType().GetField("saMonthNames",nonPublicAndInstance).SetValue(calendarData,newNames);
        calendarData.GetType().GetField("saLeapYearMonthNames",newNames);
        calendarData.GetType().GetField("saMonthGenitiveNames",newNames);
    }

    public  void TestCultureInfoHack()
    {
        RenameMonthNames("da-DK",new string[]
                                      {
                                          "jan1","feb2","mar3","apr","may","jun","jul","aug","sep","okt","nov","dec12",string.Empty
                                      });

        var today = DateTime.Now.ToLongDateString();
        Thread.CurrentThread.CurrentCulture = new CultureInfo("kl-gl",false);
        Response.Write(DateTime.Now.ToLongDateString());

        Response.Write("<br /> "); 

        Thread.CurrentThread.CurrentCulture = new CultureInfo("kl-GL");
        Response.Write(DateTime.Now.ToLongDateString());
        Response.Write("<br /> "); 
    }

注意:仅适用于.NET 4.0

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...