【问题标题】:C# .NET Implement DateTime with a different speedC# .NET 以不同的速度实现 DateTime
【发布时间】:2017-08-31 00:51:12
【问题描述】:

我有一个相当大的代码库,其中散布着一堆 DateTime.UtcNow、许多其他调用和 TimeSpan 等。

现在我们正在引入带有计时器等的任务,我需要以变速运行系统进行调试,比如一天是 5 分钟,等等。

由于有很多事情取决于时间,我不能到处改变逻辑,我可以做两件事:

  • 在 Visual Studio 中创建一个假程序集,以便我替换 DateTime;或者,
  • 我可以简单地将所有 DateTime 调用更改为我自己的类,该类通常只返回 DateTime 的结果。

但是,归根结底,它归结为编写 DateTime 的替代品,并且由于代码使用的不仅仅是 DateTime.UtcNow,如果可能的话,我想找到一个现有的解决方案。

有谁知道这样的事情是否存在?目前还没有发现

【问题讨论】:

  • 你这个可怜的东西。这几乎是不可能的。您正在处理具有static 方法的框架的核心类。您将需要为DateTime 创建一个外观 - 比如NearlyImpossibleDateTime - 并将所有调用推送到底层DateTime - 然后将所有出现的DateTime 替换为NearlyImpossibleDateTime。然后对您的代码进行静态分析以确保没有更多的DateTime。然后你可以拨弄NearlyImpossibleDateTime来改变时间的流逝。但所有这一切都将非常脆弱。祝你好运!
  • 我现在正在研究的策略是看看我是否能找到 Datetime 的来源,因为 .net 现在是开源的;然后将代码用作假程序集;我很确定这一切都是基于滴答声,也许只是改变分隔线可以让 make 让时间运行得更快.. 但到目前为止这只是一个想法,不知道这是否可行
  • 绝对不要尝试创建“假”程序集。这不仅会使测试的有效性受到质疑,而且试图在不搞砸其他调用的情况下伪造系统组件,我想这将是一场噩梦。最多,也许您可​​以使用仅用于 DateTime 调用的命名空间别名(也称为使用别名),然后使用您的自定义函数临时将其更改为命名空间。这可能仍然不是一个理想的解决方案,但比我认为的伪造装配要好。
  • 如果我只需按下 Turbo 按钮让一切运行得更快,我就会怀念我那令人敬畏的 286 系统。你没有turbo按钮是吗? :)
  • @Thomas - 你不能伪造整个 mscorlib 程序集。您的所有代码都会中断。如果你有源,你可以尝试重新创建DateTime,但它包含的内容远远超过你需要使用的内容。这就是为什么我建议创建一个外观 - 它会容易一百万倍(尽管它仍然非常困难)。

标签: c# .net


【解决方案1】:

你试过嘲笑吗? 我会创建一个接口来返回任务必须运行的时间。这样您就可以创建两个类,一个用于调试,一个用于发布,这样在调试时您可以返回所需的任何值,而无需担心核心类的工作方式。

希望对你有帮助!

【讨论】:

  • 最后就是这样结束的,因为我创建了一个类来实现我们从 datetime 使用的所有方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2014-06-28
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2015-05-22
相关资源
最近更新 更多