是否可以在 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 中的多线程应用程序,我不喜欢在每个线程上设置它。
您可以
更改当前线程的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"));