CodeDom не использует атрибуты MemberAttributes - PullRequest
0 голосов
/ 10 июля 2020

Пытаясь изучить CodeDom в Ms visual studio, я заметил, что генерация кода, похоже, игнорирует атрибуты членов, установленные для моего класса.

Это мой пример кода

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 {
    }
}

Как видите, Attributes для объекта class1 установлено на 20482, что является значением по умолчанию. Как описано здесь , это означает, что класс должен быть закрытым (20480) и окончательным (2). Вместо этого класс создается как publi c. Что здесь происходит?

1 Ответ

1 голос
/ 10 июля 2020

От пролистывания до документов :

Свойство TypeAttributes указывает значения TypeAttributes для объявления типа, которые указывают категорию типа для типа.

Дальнейшее рассмотрение TypeAttributes :

Свойство Attributes является побочным эффектом класса CodeTypeDeclaration, наследуемого от CodeTypeMember, так что классы могут быть вложенными. Флаги в свойстве TypeAttributes следует использовать вместо флагов в свойстве Attributes.

(выделено мной).

Так что, похоже, вам следует применять TypeAttributes.Sealed, et c.

Также обратите внимание, что «частный» применяется только к вложенным классам (и членам), тогда как «окончательный» обычно относится к членам: «запечатанный» - это термин для классов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...