简体   繁体   中英

Roslyn (Lambda) Expression Bodied Property Syntax

I wrote a function to convert LocalDeclaration's to Global Resources. Right now I'm replacing with each definition with a property, but I want to replace it with a property using the new syntax =>

    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);
    }

This code create a property like so:

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

I would like it to make the property like so:

public static string LocalResourceName =>Resources.LocalResourceName;

I'm not too sure what will create an expression bodied property from the syntaxfactory? Can anyone point me to the right method?

After scouring the internet I've found a way to do it. Why is there no documentation for 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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM