我想覆盖DateTime.ToSting()
函数的默认行为,以便我可以自动添加CultureInfo
。
我的最终结果是,如果有人使用这样的功能:
DateTime.Now.ToString("g");
我可以让它像这样工作:
DateTime.Now.ToString("g", new CultureInfo("en-US"));
它是 .NET 4 Framework 中的多线程应用程序,我不想在每个线程上设置它。
答案 0 :(得分:1)
您可以更改当前主题的CultureInfo
,这将导致您需要的更改。根据MSDN,DateTime.ToString
方法使用从当前文化派生的格式信息。有关详细信息,请参阅CurrentCulture
。
因此,您只需编辑用于创建其他线程的线程中的CultureInfo.CurrentCulture
属性,这将引导您实现所需的行为。
MSDN多线程示例和AppDomains
:
using System;
using System.Globalization;
using System.Threading;
public class Info : MarshalByRefObject
{
public void ShowCurrentCulture()
{
Console.WriteLine("Culture of {0} in application domain {1}: {2}",
Thread.CurrentThread.Name,
AppDomain.CurrentDomain.FriendlyName,
CultureInfo.CurrentCulture.Name);
}
}
public class Example
{
public static void Main()
{
Info inf = new Info();
// Set the current culture to Dutch (Netherlands).
Thread.CurrentThread.Name = "MainThread";
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
inf.ShowCurrentCulture();
// Create a new application domain.
AppDomain ad = AppDomain.CreateDomain("Domain2");
Info inf2 = (Info) ad.CreateInstanceAndUnwrap(typeof(Info).Assembly.FullName, "Info");
inf2.ShowCurrentCulture();
}
}
// The example displays the following output:
// Culture of MainThread in application domain ChangeCulture1.exe: nl-NL
// Culture of MainThread in application domain Domain2: nl-NL
您可以尝试通过Microsoft Fakes或Moles或类似工具覆盖该方法的使用情况,但实际上并不推荐这样做。
答案 1 :(得分:0)
DateTime是一个密封的结构,因此无法继承。实现此目的的一种方法是使用Extension:
public static class MyDateTimeExtension
{
public static string ToMyCulture(this DateTime dt, CultureInfo info)
{
...
}
}
DateTime timeTest = DateTime.Now;
var myTimeString = timeTest.ToMyCulture(new CultureInfo("en-US"));