【问题标题】:CodeDom not using MemberAttributesCodeDom 不使用 MemberAttributes
【发布时间】:2020-10-31 00:10:48
【问题描述】:

在 Ms Visual Studio 下尝试学习 CodeDom 时,我注意到代码生成似乎忽略了为我的班级设置的成员属性。

这是我的示例代码

using Microsoft.CSharp;
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;

namespace CodeDomTest
{
    class Program
    {
        public static CodeCompileUnit BuildHelloWorldGraph()
        {
            // Create a new CodeCompileUnit to contain
            // the program graph.
            CodeCompileUnit compileUnit = new CodeCompileUnit();

            // Declare a new namespace called Samples.
            CodeNamespace samples = new CodeNamespace("Samples");
            // Add the new namespace to the compile unit.
            compileUnit.Namespaces.Add(samples);

            // Declare a new type called Class1.
            CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
            // Add the new type to the namespace type collection.
            samples.Types.Add(class1); // should be private
            Console.WriteLine("Class1 attributes: " + class1.Attributes);

            return compileUnit;
        }
        public static string GenerateCSharpCode(CodeCompileUnit compileunit)
        {
            // Generate the code with the C# code provider.
            CSharpCodeProvider provider = new CSharpCodeProvider();

            // Create a TextWriter to a StreamWriter to the output file.
            StringWriter strWriter = new StringWriter();

            IndentedTextWriter tw = new IndentedTextWriter(strWriter, "    ");

            // Generate source code using the code provider.
            provider.GenerateCodeFromCompileUnit(compileunit, tw,
                new CodeGeneratorOptions());

            // Close the output file.
            tw.Close();

            return strWriter.ToString();
        }

        static void Main(string[] args)
        {
            Console.WriteLine(GenerateCSharpCode(BuildHelloWorldGraph()));
            Console.ReadKey();
        }
    }
}

它产生以下输出:

Class1 attributes: 20482
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Samples {


    public class Class1 {
    }
}

如您所见,class1 对象的Attributes 设置为 20482,这是默认值。如here 所述,这意味着该类应该是私有的(20480)和最终的(2)。相反,该类是作为公共生成的。 这里发生了什么?

【问题讨论】:

  • 快速浏览一下文档,也许您应该使用TypeAttributes 来代替CodeTypeDeclaration?非嵌套类不能是私有的,“final”是应用于成员的东西,而不是类(类是“密封的”)
  • @canton7 好的,我错过了。将其设置为[...]NestedPrivate 确实可以解决问题。非常奇怪的是,该对象同时具有处理访问修饰符的AttributesTypeAttributes。我知道这没有意义。我只是想更好地理解这一点。把它放在一个答案中,我很乐意接受它
  • 奇怪的是CodeTypeDeclarationCodeTypeMember,因此继承了通常应用于成员的属性

标签: c# code-generation codedom


【解决方案1】:

通过the docs 的轻弹:

TypeAttributes 属性表示类型声明的 TypeAttributes 值,表示类型的类型类别。

进一步看TypeAttributes

Attributes 属性是继承自 CodeTypeMember 的 CodeTypeDeclaration 类的副作用,因此可以嵌套类。 应使用 TypeAttributes 属性中的标志,而不是 Attributes 属性中的标志。

(强调我的)。

所以看起来你应该申请TypeAttributes.Sealed等。

另请注意,“private”仅适用于嵌套类(和成员),而“final”通常指的是成员:“sealed”是类的术语。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多