【问题标题】:How can I save lines of C# code into a string?如何将 C# 代码行保存到字符串中?
【发布时间】:2021-01-07 00:19:16
【问题描述】:

我正在编写一系列测试来验证我正在编写的代码。我希望测试文档列出测试如何发现错误。而不是确保文档通过测试更新,我想输出代码行。有没有办法将它保存在字符串中?

代码如下:

string Date = String.Format("Name = {0}, hours = {1:hh}", name, DateTime.Now);
string Code = ""Name = {0}, hours = {1:hh}", name, DateTime.Now"

Date 将被评估,而 Code 将是文字字符串。比如:

string Date = string.Format(Code);

【问题讨论】:

  • 你这到底是什么意思... "我不想确保文档得到更新,我想输出代码行" 什么测试以及我们在谈论什么文档,它们之间的关系如何。
  • 我正在检查梯形逻辑中的方程式是否彼此一致。一个方程的一部分应该出现在其他方程中。我正在使用 string.Format 来构建等式的外观并将其与所写的内容进行比较。在测试的每个部分中,我都包括了预期的方程是如何构建的,因为已经做出了假设。

标签: c# string string.format code-documentation


【解决方案1】:

我认为你最好使用服务来记录它。但我仍然会给你一个解决方案。 您可以使用委托来记录当前状态(它是一个闭包),当您需要它时,您可以调用它并获取它的返回值。 这样做:

using System;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var john = new Producer();
            var log = john.Produce();
            Console.WriteLine($"John's log is \"{log()}\"");
        }
    }

    class Producer
    {
        public Func<string> Produce()
        {
            var name = "John";
            Console.WriteLine("John is producing.");
            return () =>
            {
                return $"Name = {name}, hours = {DateTime.Now:hh}";
            };
        }
    }
}

输出:

John is producing.
John's log is "Name = John, hours = 08"

【讨论】:

  • 在本例中,我希望控制台输出“Name = {name}, hours = {DateTime.Now:hh}”。我知道必须有更好的方法来记录代码,但重要的是要显示在测试结果旁边,以了解测试是如何构建的以及做出了什么假设。我在其他 cmets 中解释了更多。
  • 你的意思是要通过一个字符串进行函数调用并获取它的返回值吗?
  • 我遇到的问题是,当输入 string.Format 函数时,字符串需要正常工作。现在我复制代码并转义括号,我可以看到代码使用良好,但不能保证我没有在不更新“文档”的情况下更改代码。当我有那个字符串时,我不能只使用 string.Format(code),因为它不再适合这种格式。
【解决方案2】:

我相信您可能能够使用新的C# 9.0 code generators 来做到这一点。它们允许您进行自动代码重写,例如注入与您的用例类似的日志调用。

这是一本包含一些“代码重写”食谱的食谱:

https://github.com/dotnet/roslyn/blob/master/docs/features/source-generators.cookbook.md

我是代码生成器的新手,它们仍处于预览阶段(!)所以我不知道你想要的是否真的可能,但至少是检查代码并在每行基础上增加它的一般想法(在您的情况下,通过从代码行中创建一个字符串并执行它)看起来像代码重写生成器可以用于什么。

【讨论】:

  • 感谢您的提醒。早上我会调查的。我认为这确实是一个工作流程问题,但我希望用代码来解决它。这些测试必须是可信的,所以每次我们使用它们时都要进行代码审查是很痛苦的。测试在不断增长,但我也许可以将它们分开并为已知的良好测试生成校验和。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
相关资源
最近更新 更多