使用 Roslyn 生成 getter 和 setter lambda

Posted

技术标签:

【中文标题】使用 Roslyn 生成 getter 和 setter lambda【英文标题】:generate getter and setter lambda with Roslyn 【发布时间】:2022-01-19 12:17:31 【问题描述】:

我是使用 Roslyn 的新手,事实是我发现它很有趣,但是在使用 lambda 表达式时我被阻止了。我想用 lambda 生成一个带有 getter 和 setter 的属性,所以它看起来像这样:

private string uiDescription;
private string uiDescription;

public override string UiDescription 
    get => uiDescription ?? Name;
    set => uiDescription = value;

这可能吗?提前致谢

【问题讨论】:

那些不是 lambda。这些都是有表情的成员。 【参考方案1】:

我已经找到了,所以我会把它留在这里以防万一有人感兴趣。当然可以做得更好:

var variableDeclarationDescription = SyntaxFactory.VariableDeclaration(SyntaxFactory.ParseTypeName("string"))
               .AddVariables(SyntaxFactory.VariableDeclarator("uiDescription"));

var fieldDeclarationDescription = SyntaxFactory.FieldDeclaration(variableDeclarationDescription)
                .AddModifiers(SyntaxFactory.Token(SyntaxKind.PrivateKeyword));

  
var descriptionBody = variableDeclarationDescription.Variables.ToString()+ " ?? Name;"
var resourceGet = SyntaxFactory.IdentifierName(descriptionBody);
     
descriptionBody = variableDeclarationDescription.Variables.ToString() + " = value ;";
var resourceSet = SyntaxFactory.IdentifierName(descriptionBody);

var propertyGetLambda = SyntaxFactory.ArrowExpressionClause(resourceGet);
var propertySetLambda = SyntaxFactory.ArrowExpressionClause(resourceSet);

var propertyDeclarationDescription = SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("string"), "UiDescription")
                .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword), SyntaxFactory.Token(SyntaxKind.OverrideKeyword))
                .AddAccessorListAccessors(
                    SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).
                         WithExpressionBody(propertyGetLambda),
                     SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).
                         WithExpressionBody(propertySetLambda)
                );

我希望它可以在未来为某人服务。谢谢

【讨论】:

添加一个简短的解释,说明您这样做的原因/原因,这对与您处于相同情况的任何人都有用。 其实出现了怀疑的情况,因为用户Sweeper已经很好的纠正了,在表情成员的使用中。所以这个想法是任何想要渲染这些表达式的人都可以使用代码的 ArrowExpressionClause 部分。在这种情况下,其余的只是将其渲染为与上面相同。希望对你有帮助,非常感谢。

以上是关于使用 Roslyn 生成 getter 和 setter lambda的主要内容,如果未能解决你的问题,请参考以下文章