簡體   English   中英

Roslyn (Lambda) 表達式主體屬性語法

[英]Roslyn (Lambda) Expression Bodied Property Syntax

我編寫了一個函數來將 LocalDeclaration 轉換為全局資源。 現在我正在用一個屬性替換每個定義,但我想使用新語法將它替換為一個屬性 =>

    public PropertyDeclarationSyntax ConvertToResourceProperty(string resouceClassIdentifier, string fieldName, string resourceKey, CSharpSyntaxNode field)
    {
        var stringType = SyntaxFactory.ParseTypeName("string");

        var resourceReturnIdentifier = SyntaxFactory.IdentifierName(resouceClassIdentifier + "." + resourceKey);
        var returnResourceStatement = SyntaxFactory.ReturnStatement(resourceReturnIdentifier).NormalizeWhitespace();
        var getRescourceBlock = SyntaxFactory.Block(returnResourceStatement);

        var getAccessor = SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, getRescourceBlock).WithAdditionalAnnotations(Formatter.Annotation, Simplifier.Annotation);

        var propertyDeclaration = SyntaxFactory.PropertyDeclaration(stringType, fieldName).AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword), SyntaxFactory.Token(SyntaxKind.StaticKeyword)).NormalizeWhitespace();

        propertyDeclaration = propertyDeclaration.AddAccessorListAccessors(getAccessor).WithAdditionalAnnotations(Formatter.Annotation);

        SyntaxTrivia[] leadingTrivia = field.GetLeadingTrivia().ToArray() ?? new[] { SyntaxFactory.Whitespace("\t") };
        return propertyDeclaration.WithTrailingTrivia(SyntaxFactory.Whitespace("\r\n"))
                    .WithLeadingTrivia(leadingTrivia)
                    .WithAdditionalAnnotations(Simplifier.Annotation);
    }

這段代碼創建了一個像這樣的屬性:

public static string LocalResourceName
{
    get{ return Resources.LocalResourceName; }
}

我希望它使財產像這樣:

public static string LocalResourceName =>Resources.LocalResourceName;

我不太確定什么會從語法工廠創建表達式主體屬性? 誰能指出我正確的方法?

在網上搜索之后,我找到了一種方法。 為什么沒有 roslyn 的文檔?

public PropertyDeclarationSyntax ConvertToResourceProperty(string resouceClassIdentifier, string fieldName, string resourceKey, CSharpSyntaxNode field)
{
    var stringType = SyntaxFactory.ParseTypeName("string");

    var resourceClassName = SyntaxFactory.IdentifierName(resouceClassIdentifier);
    var resourceKeyName = SyntaxFactory.IdentifierName(resourceKey);
    var memberaccess = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, resourceClassName, resourceKeyName);

    var propertyLambda = SyntaxFactory.ArrowExpressionClause(memberaccess);

    var propertyDeclaration = SyntaxFactory.PropertyDeclaration(new SyntaxList<AttributeListSyntax>(), new SyntaxTokenList(), 
                                                                stringType, null, SyntaxFactory.Identifier(fieldName), null, 
                                                                propertyLambda, null, SyntaxFactory.Token(SyntaxKind.SemicolonToken))
                                                                        .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword), 
                                                                    SyntaxFactory.Token(SyntaxKind.StaticKeyword)).WithAdditionalAnnotations(Formatter.Annotation).NormalizeWhitespace();

    return propertyDeclaration.WithTrailingTrivia(SyntaxFactory.ElasticCarriageReturnLineFeed)
                .WithLeadingTrivia(field.GetLeadingTrivia().ToArray())
                .WithAdditionalAnnotations(Simplifier.Annotation);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM