Можно ли сгенерировать атрибут с параметром Enum через Roslyn - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы создать настраиваемый атрибут, который получает значение параметра Enum. Пока мне удалось создать его со строковым параметром, но я полностью заблудился в управлении перечислением в Roslyn API, и отсутствие примеров в документации, конечно, не помогает.

Мой рабочий пример :

    return SyntaxFactory.AttributeList(
                SyntaxFactory.SingletonSeparatedList(
                    SyntaxFactory.Attribute(
                        SyntaxFactory.IdentifierName("TestAttribute"),
                        SyntaxFactory.AttributeArgumentList(
                            SyntaxFactory.SeparatedList(
                                new[]
                                {
                                    SyntaxFactory.AttributeArgument(
                                        SyntaxFactory.LiteralExpression(
                                            SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(
                                                "TestEnum.SomeValue"))))

                                }
                            )
                        )
                    )
                )
            );

Использование этого фрагмента позволяет мне получить следующий результат:

[TestAttribute("TestEnum.SomeValue")]        
public void SomeMethod() {}

Я хочу достичь следующего:

[TestAttribute(TestEnum.SomeValue)]      // Enum instead of string  
public void SomeMethod() {}

1 Ответ

0 голосов
/ 05 августа 2020

Попробуйте следующее:

return SyntaxFactory.AttributeList(
        SyntaxFactory.SingletonSeparatedList(
            SyntaxFactory.Attribute(
                SyntaxFactory.IdentifierName("TestAttribute"),
                SyntaxFactory.AttributeArgumentList(
                    SyntaxFactory.SeparatedList(
                        new[]
                        {
                            SyntaxFactory.AttributeArgument(
                                SyntaxFactory.MemberAccessExpression(
                                    SyntaxKind.SimpleMemberAccessExpression, 
                                    SyntaxFactory.IdentifierName("TestEnum"),
                                    SyntaxFactory.Token(SyntaxKind.DotToken),
                                    SyntaxFactory.IdentifierName("SomeValue")
                                )
                            )
                        }
                    )
                )
            )
        )
    );
...