码迷,mamicode.com
首页 > 编程语言 > 详细

设置.Net多线程默认CultureInfo

时间:2016-08-28 18:03:24      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:

.net编码过程中,当我们新开一个线程时,其默认的CurrentCulture属性为当前系统的Culture,在软件的本地化没有完成的情况下,采用默认系统的文化编码方式,可能会导致软件在界面显示,数字、符号、时间格式化等方面出现异常,导致软件运行错误。例如在中英文系统中,一般采用点号作为double类型数据的分隔符,而在俄语系统中采用逗号作为分隔。

技术分享 技术分享

如果要改变其CurrentCulture属性,一般通过修改 Thread.CurrentCulture值来实现。然而,当新开线程较多时,逐一设置极为麻烦,容易产生疏漏。为此,笔者查阅了诸多文献和网络博客,找到了一种通用的默认CultureInfo属性设置方案。

.net环境是framework4.5及以上版本时,CultureInfo提供了两个静态属性 DefaultThreadCulture和DefaultThreadUICulture,一处修改即可实现所有的未显式设置 Thread.CurrentCulture的线程使用该Default值。

.net环境是framework4.0版本时,可通过反射设置两个私有静态字段s_userDefaultCulture和s_userDefaultUICulture来实现。

.net环境是framework4.0以下版本时,可通过反射设置两个私有静态字段m_userDefaultCulture和m_userDefaultUICulture来实现。

示例代码如下:

 1 using System.Globalization;
 2 using System.Reflection;
 3 
 4 public void SetDefaultCulture(CultureInfo culture)  
 5 {
 6     Type type = typeof(CultureInfo);
 7 
 8     try
 9     {
10         type.InvokeMember("s_userDefaultCulture",
11                             BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
12                             null,
13                             culture,
14                             new object[] { culture });
15 
16         type.InvokeMember("s_userDefaultUICulture",
17                             BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
18                             null,
19                             culture,
20                             new object[] { culture });
21     }
22     catch { }
23 
24     try
25     {
26         type.InvokeMember("m_userDefaultCulture",
27                             BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
28                             null,
29                             culture,
30                             new object[] { culture });
31 
32         type.InvokeMember("m_userDefaultUICulture",
33                             BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
34                             null,
35                             culture,
36                             new object[] { culture });
37     }
38     catch { }
39 }

代码中采用try-catch模块包裹两项反射设置是为了保证其通用性,在低于framewor4.5版本的程序中,只需要加入上述代码,调用一次即可实现多线程cultureinfo属性设置,有效避免了因地域文化差异而导致的错误。

参考资料:

1、https://www.rastating.com/setting-default-currentculture-in-all-versions-of-net/

2、https://msdn.microsoft.com/zh-cn/library/26etazsy%28v=vs.110%29.aspx#FormatProviders

 

 

 

设置.Net多线程默认CultureInfo

标签:

原文地址:http://www.cnblogs.com/whugreyhound/p/setdefaultCulture_Greyhound.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!