简体   繁体   English

Roslyn (Lambda) 表达式主体属性语法

[英]Roslyn (Lambda) Expression Bodied Property Syntax

I wrote a function to convert LocalDeclaration's to Global Resources.我编写了一个函数来将 LocalDeclaration 转换为全局资源。 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?为什么没有 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