【问题标题】:Prevent CodeDom from splitting large strings防止 CodeDom 拆分大字符串
【发布时间】:2011-03-01 04:41:07
【问题描述】:

我正在使用 CodeDom 生成 C# 代码,其中一部分涉及吐出 String 变量内容。有时,这些字符串会变得很长。

有没有办法防止 CodeDom 代码生成器将这些大字符串拆分成更小的块?生成器所做的是将长字符串拆分为几个较小的字符串,并在其间插入连接运算符。虽然代码编译得很好,但我不喜欢它弄乱了我的代码的可读性。

【问题讨论】:

  • 你为什么想要/需要它来生成可读的代码?
  • 有多种原因。最常见的用例是当您想要摆脱 CodeDom 代码生成器(例如,使用另一种技术重构它们,如 T4 模板),并且您需要它们生成更易于比较的输出源代码。许多开发人员使用 CodeDom 过度使用代码生成,而实际上他们应该只使用一种简单、更易于维护且更易于阅读的技术来实现相同的结果。

标签: c# .net codedom


【解决方案1】:

嗯.. 我不这么认为。用 .NET Reflector 戳入 Microsoft.CSharp.CSharpCodeGenerator 的源代码(系统内部),我们发现:

private void GeneratePrimitiveExpressionBase(CodePrimitiveExpression e)
{
...
    else if (e.Value is string)
    {
        this.Output.Write(this.QuoteSnippetString((string) e.Value));
    }
...
}

还有……这个:

private string QuoteSnippetString(string value)
{
    if (((value.Length >= 0x100) && (value.Length <= 0x5dc)) && (value.IndexOf('\0') == -1))
    {
        return this.QuoteSnippetStringVerbatimStyle(value);
    }
    return this.QuoteSnippetStringCStyle(value);
}

如果你进一步挖掘,这两个功能都是不可配置的。

【讨论】:

  • 那太糟糕了。感谢您向我指出 CSharpCodeGenerator 中的适当私有方法,我能够确定至少每 80 个字符发生一次拆分。
  • 其实第一次拆分发生在81个字符之后,后续拆分发生在80个字符之后。虽然这是一种解决方法,但我更喜欢Satyajit's solution:只需使用带双引号的 CodeSnippetExpression,并在必要时替换字符串中的特殊字符(例如 \n、\r、\t、双引号等)。
【解决方案2】:

我想我找到了解决这个问题的方法:简而言之,我可以通过显式引用我的字符串参数来使用 CodeSnippetExpression,而不是使用 CodePrimitiveExpression 来输出我的字符串。

CodeExpression x = new CodeSnippetExpression("\"" + myLongString + "\"");

适用于我必须使用它的少数情况,但当然我还没有测试所有场景。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多