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

本文关键字:ToString DateTime 函数 覆盖 是否 | 更新日期: 2023-09-27 18:37:02

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

我的最终结果是,如果有人像这样使用函数:

DateTime.Now.ToString("g");

我可以让它像这样工作:

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

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

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

您可以

更改当前线程的CultureInfo,这将导致您需要的更改。根据 MSDN,DateTime.ToString方法使用从当前区域性派生的格式信息。有关详细信息,请参阅CurrentCulture

因此,您只需编辑用于创建其他线程的线程中的 CultureInfo.CurrentCulture 属性,这将引导您获得所需的行为。

多线程和AppDomains的 MSDN 示例:

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或类似工具覆盖该方法的使用,但实际上并不建议这样做。

DateTime 是一个密封结构,因此不能继承。使用扩展实现此目的的一种方法:

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