【问题标题】:Roslyn (Lambda) Expression Bodied Property SyntaxRoslyn (Lambda) 表达式主体属性语法
【发布时间】:2017-06-06 18:33:19
【问题描述】:

我编写了一个函数来将 LocalDeclaration's 转换为 Global Resources。现在我用属性替换每个定义,但我想用新语法替换它=>

    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;

我不太确定什么会从语法工厂创建表达式主体属性?谁能指出正确的方法?

【问题讨论】:

    标签: c# lambda properties roslyn


    【解决方案1】:

    在网上搜索之后,我找到了一种方法。为什么没有 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);
    }
    

    【讨论】:

    • 这是一个有用的资源,可以帮助您了解如何生成这些:roslynquoter.azurewebsites.net
    • @JoshVarty 感谢使用即时窗口的资源太烦人了
    猜你喜欢
    • 2012-09-11
    • 2020-06-23
    • 2011-07-12
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多