代码之家  ›  专栏  ›  技术社区  ›  NotDan

使用.NET codedom代码生成时,如何自定义自动生成的注释?

  •  13
  • NotDan  · 技术社区  · 14 年前

    我在用 CodeCompileUnit CSharpCodeProvider 生成一些源代码。它将下面的标题添加到所有生成的代码中。有没有一种定制评论的方法,让它说些别的?

    // <auto-generated>
    //     This code was generated by a tool.
    //     Runtime Version:2.0.50727.3053
    //
    //     Changes to this file may cause incorrect behavior and will be lost if
    //     the code is regenerated.
    // </auto-generated>
    
    5 回复  |  直到 9 年前
        1
  •  6
  •   Joel Rondeau    14 年前

    你不能。我建议在这之后立即添加你自己的评论。下面是一个如何做到这一点的示例: http://www.codeproject.com/KB/dotnet/ResourceClassGenerator.aspx

        2
  •  3
  •   Ruth M.    10 年前

    您只需在文件开头添加注释,如下所示:

    //----------------------------------------------------------------------------
    // My comments
    // Are go here
    //----------------------------------------------------------------------------
    // <auto-generated>
    //     This code was generated by a tool.
    //     Runtime Version:2.0.50727.3053
    //
    //     Changes to this file may cause incorrect behavior and will be lost if
    //     the code is regenerated.
    // </auto-generated>
    //----------------------------------------------------------------------------
    

    在向文本编写器生成compileUnit之前,请执行以下操作:

    CSharpCodeProvider provider = new CSharpCodeProvider();
    var tw = new IndentedTextWriter(new StreamWriter(filename, false), "    ");
    
    tw.WriteLine("//----------------------------------------------------------------------------");
    tw.WriteLine("// My comments");
    tw.WriteLine("// Are go here");
    
    provider.GenerateCodeFromCompileUnit(compileUnit, tw, new CodeGeneratorOptions());
    
        3
  •  1
  •   brady gaster    9 年前

    由于您不能通过codedom中提供的API来完成这项工作,下面是一些我刚为自己编写的代码来解决这个问题。不完美,但会有技巧。

    var marker = "//------------------------------------------------------------------------------";
    var allTheCode = sw.ToString();
    var justTheRealCode = allTheCode.Substring(allTheCode.IndexOf(marker) + marker.Length, allTheCode.LastIndexOf(marker) + marker.Length);
    justTheRealCode = allTheCode.Substring(justTheRealCode.Length);
    
        4
  •  1
  •   Phil S    9 年前

    相当笨拙,但当我需要这样做时,我创建了一个类,它包装输出流并切掉前十行:

        /// <summary>
        /// Removes the first 10 lines from the output.  This removes the junk from the .NET Code Generator.
        /// </summary>
        internal class CodeOutputHelper : TextWriter
        {
            private readonly TextWriter _Inner;
            private int _CountDown = 10;
    
            public CodeOutputHelper( TextWriter inner )
            {
                _Inner = inner;
            }
    
            public override void WriteLine(string s)
            {
                if( _CountDown-- <= 0 )
                {
                    _Inner.WriteLine(s);
                }
            }
    
            public override void Write( string value )
            {
                if (_CountDown<=0)
                _Inner.Write( value );
            }
    
            public override void Write( char value )
            {
                _Inner.Write( value );
            }
    
            public override Encoding Encoding
            {
                get
                {
                    return _Inner.Encoding;
                }
            }
        }
    }
    
        5
  •  0
  •   stakx - no longer contributing Saravana Kumar    11 年前

    虽然codedom似乎不直接支持这一点,但您可以使用这样一个事实:这个注释是由标记显式分隔的。 <auto-generated> </auto-generated> . 因此,您可以通过对codedom的输出执行字符串操作来更改此注释:

    var provider = new CSharpCodeProvider();
    string generatedCode;
    using (var output = new StringWriter())
    {
        provider.GenerateCodeFrom…(…, output, …);
        generatedCode = output.ToString();
    }
    string modifiedCode = Regex.Replace(generatedCode, …); // modify the output as you see fit