Может ли Roslyn генерировать перечисления? - PullRequest
3 голосов
/ 05 декабря 2011

Итак, я чувствую, что это возможно, но у меня нет отбивных, чтобы собрать это вместе. У меня есть таблицы поиска (с полями ID и Name). У меня есть перечисления, которые я синхронизирую с поиском. Я хотел бы составить список таблиц SQL и сделать так, чтобы roslyn создавал перечисления во время / до компиляции. таким образом, я знаю, что мои перечисления всегда синхронизированы, и это еще одна вещь с моей тарелки.

Может ли кто-нибудь показать мне путь или сказать, почему это будет плохой идеей? Я чувствую, что решение не очень много кода ...

Спасибо!

Ответы [ 3 ]

6 голосов
/ 05 декабря 2011

Вот как вы создаете перечисления с roslyn;

class Program
{
    static void Main(string[] args)
    {
        var member1 = Syntax.EnumMemberDeclaration(
            identifier: Syntax.Identifier("Member1")
            );

        var declaration = Syntax.EnumDeclaration(
            identifier: Syntax.Identifier("MyEnum"),
            modifiers: Syntax.TokenList(Syntax.Token(SyntaxKind.PublicKeyword)),
            members: Syntax.SeparatedList(member1)
            );

        Console.WriteLine(declaration.Format());
        Console.ReadLine();
    }
}

это возвращает:

public enum MyEnum
{
    Member1
}

Теперь на ваш вопрос, я не знаю, действительно ли это то, что вам действительно нужно,

Во-первых, я думаю, что пока нет встроенных функций, позволяющих сделать это при прекомпиляции, поэтому вам нужно создать консольный exe-файл и вызывать его в событиях предварительной сборки.

Итак, на этомСкорее всего, лучше сделать это вручную с помощью генерации кода, а не в каждой сборке, если только эти таблицы не меняются очень часто.

В этом случае вам не нужен Roslyn, чтобы сделать это за вас, вы можете просто выплюнуть его с помощью любого программного обеспечения для генерации кода или развернуть свое собственное ...

1 голос
/ 05 апреля 2016

Вот некоторый код, обновленный для текущей версии Roslyn, а также показывает добавление атрибутов и значений к элементам перечисления.

        public EnumDeclarationSyntax GenerateEnum()
    {
        var loanPurpose = new[]
        {
            "Business Launching",
            "HomePurchase",
            "HomeImprovement"

        };
        var enumDescriptions = new[]
        {
            "Launch a new business",
            "Buy a home",
            "Make home improvements"
        };
        var i = 0;
        var members = new List<EnumMemberDeclarationSyntax>();
        foreach (var item in loanPurpose)
        {
            var attribute = SyntaxFactory.Attribute(
                SyntaxFactory.IdentifierName("Description"));
            var attributeArgument = SyntaxFactory.AttributeArgument(
                SyntaxFactory.LiteralExpression(
                    SyntaxKind.StringLiteralExpression,
                    SyntaxFactory.Literal(enumDescriptions[i ])));
            attribute = attribute.WithArgumentList(
                SyntaxFactory.AttributeArgumentList(
                    SyntaxFactory.SingletonSeparatedList(attributeArgument)));
            var attributes = SyntaxFactory.SingletonList(
                SyntaxFactory.AttributeList(SyntaxFactory
                    .SingletonSeparatedList(attribute)));
            var objectCreationExpression = SyntaxFactory.EqualsValueClause(
                SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression,
                    SyntaxFactory.Literal(i)));
            var member = SyntaxFactory.EnumMemberDeclaration(attributes, 
                SyntaxFactory.Identifier(item),
                objectCreationExpression);
            members.Add(member);
            i++;
        }
        var declaration = SyntaxFactory.EnumDeclaration
            (new SyntaxList<AttributeListSyntax>(),
            baseList: null,
            identifier: SyntaxFactory.Identifier("LoanPurpose"),
            modifiers: SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword)),
            members: SyntaxFactory.SeparatedList(members)
            );
        return declaration;
    }

Синтаксис для добавления атрибутов становится немного неловким, но я нахожу, что ячасто нужно добавить некоторые атрибуты.Возможно, у вас уже есть данные для атрибутов и значений в таблицах поиска, которые управляют генерацией кода.

0 голосов
/ 18 декабря 2017

Ответ, предоставленный Себастьяном 6 лет назад, вероятно, работал, но больше не работает.Новый набор примеров кода для выполнения того же действия, что и 18/12/2017

EnumMemberDeclarationSyntax member1 = EnumMemberDeclaration(identifier: Identifier("Member1"));

var members =new SyntaxNodeOrToken[]{member1};

var declaration = EnumDeclaration(
            identifier: Identifier("MyEnum")).WithMembers(
            members: SeparatedList< EnumMemberDeclarationSyntax>(members));
...