【问题标题】:c# extension method to define method that behaves like a static class / type method, not an instance methodc#扩展方法来定义行为类似于静态类/类型方法的方法,而不是实例方法
【发布时间】:2020-09-06 07:49:47
【问题描述】:

我在一个类中有这个静态方法:

public class MyTimeZoneHelperClass {

        public static TimeZoneInfo EST = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

        public static DateTime Convert_UTC_to_EST(this DateTime utcDateTime)
        {
            return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, EST);
        }

        public static DateTime NowEST()
        {
            return DateTime.UtcNow.Convert_UTC_to_EST();
        }
}

我刚刚为 DateTime TYPE 编写了一个扩展方法,我将其命名为“EstNow”,因此我可以使用 DateTime.EstNow,就像这段代码使用 DateTime.UtcNow 一样。如果我有这个,我就不必引用上面的这个静态类 - MyTimeZoneHelperClass.NowEst - 我的代码会更干净一点,我不必记住那个类名/我更喜欢这里的一个类而不是两个.

所以扩展方法不能那样工作。它们是静态方法,但是你需要一个类的实例来调用该方法 - 呵呵!

这可能吗?我可以(最好是轻松地)让编译器识别类型上的新/自定义静态方法吗?

【问题讨论】:

  • 顺便说一句,我强烈建议您将您的领域(最好是在使其成为属性之后)称为EasternTime 而不是EST。尽管有时区 ID,它 不是 EST - 它是东部时间,在 EST 和 EDT 之间变化。 (无论如何,这可能是您想要的,但我强烈建议您避免使用“EST”作为“东部时间”的同义词,因为它们不是同一个东西。)我还鼓励您遵循 .NET 命名约定(没有下划线,并使用Utc 而不是UTC 等)。
  • 根据我的经验,我在下一个项目中再也不会直接使用 DateTime 了。我经常读到有人建议这样做,我开始了解它的好处。我会制作一个接口和一个自己的实现,将 DateTime 与所需的所有功能封装起来。您可以将其转换为 DateTime 用于您的旧代码。这会以某种方式解决你的问题,不是吗?但尤其是对于单元测试,这似乎非常有用(例如,通过模拟一个假的当前时间)。
  • 说起来老兄。我必须打破所有这些工作规则,我应该养成这个习惯。所以说出来......但这是个人的,也许是一次性的,我只是想尽可能快地写这个东西。 :)
  • 告诉 Reno,我确实需要当前的日期时间来进行单元测试。谢谢。主要是好奇。但是,是的,对于我的迫切需要,DateTime.EstNow 会很方便。

标签: c# timezone extension-methods static-methods


【解决方案1】:

不,您不能编写“静态扩展”成员来扩展类型而不是类型的实例。它只是不是 C# 的一部分。它已经讨论过,它可能在未来发生,尽管我不相信它在 C# 9 的预期功能列表中。

【讨论】:

    【解决方案2】:

    正如我们所说,c# github 上有一个未解决的问题:https://github.com/dotnet/csharplang/issues/2505

    开放意味着它还没有实现。总结一下:

    1. 没有解决此问题的方法,没有任何尝试可以减轻缺失的功能
    2. 目前似乎没有兴趣实现此功能

    ldm 上没有人认为现在值得支持。

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 2017-01-30
      • 2015-08-12
      • 2020-10-24
      • 2011-05-29
      • 1970-01-01
      • 2020-04-15
      • 2018-03-07
      • 2011-11-16
      相关资源
      最近更新 更多