如何写出"流利的"日期时间值?

jim*_*gan 10 c# datetime

如何编写允许编译以下代码的C#代码:

var date = 8.September(2013); // Generates a DateTime for the 8th of September 2013
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 17

您可以使用扩展方法:

public static class MyExtensions
{
    public static DateTime September(this int day, int year)
    {
        return new DateTime(year, 9, day);
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这通常是不好的做法,我建议不要这样做,特别是对于像这样微不足道的事情 - new DateTime(2013, 9, 8)实际上要比这更难8.September(2013)吗?有时这种技巧可能对练习有用或有趣,但应该谨慎使用.

  • @Sparko你住在哪里? (4认同)
  • 为什么这会被贬低?它完美地回答了这个问题.+1. (3认同)
  • @Sparko - 这不是javascript. (3认同)
  • @Sparko我承认,当我第一次输入它时,我发现了这个问题(想到第二个参数,最后输入了2个),但我立刻纠正了它. (2认同)
  • @Sparko - 我只看到了`9`版本.在基于零的月份的javascript中,"新日期(2013,9,8)"是10月.我认为这可能是评论的原因. (2认同)

Mik*_*bel 14

我会建议不要这样,因为它让我觉得非常糟糕.也就是说,如果你真的想静态地这样做,你需要定义十二种不同的扩展方法(每个月名称一个),如下所示:

public static class DateConstructionExtensions
{
    public static DateTime January(this int day, int year)
    {
        return new DateTime(year, /* month: */1, day);
    }

    // equivalent methods for February, March, etc...
}
Run Code Online (Sandbox Code Playgroud)

  • 我实际上发现这在编写测试时非常实用 - 它们最终非常容易阅读.我不会将它用于非测试代码. (8认同)
  • 我无法描述我开始使用它的诱惑力. (2认同)

Cha*_*ion 8

你可以通过扩展来做到这一点:

public static DateTime September(this int day, int year) {
    return new DateTime(year, 9, day);
}
Run Code Online (Sandbox Code Playgroud)

当然,你需要12个这样的扩展,每个月一个.