是否可以在C#中覆盖DateTime.ToString()函数

时间:2015-01-11 15:20:48

标签: c# multithreading datetime cultureinfo

我想覆盖DateTime.ToSting()函数的默认行为,以便我可以自动添加CultureInfo

我的最终结果是,如果有人使用这样的功能:

DateTime.Now.ToString("g");

我可以让它像这样工作:

DateTime.Now.ToString("g", new CultureInfo("en-US"));

它是 .NET 4 Framework 中的多线程应用程序,我不想在每个线程上设置它。

2 个答案:

答案 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 FakesMoles或类似工具覆盖该方法的使用情况,但实际上并不推荐这样做。

答案 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"));