使用 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的主要内容,如果未能解决你的问题,请参考以下文章

使用lombok注解@Getter @Setter方法代码编译成功,但是没有生成get,set方法

当我们需要生成模板输出工件时,我们如何用 Roslyn 替换 T4

在 Roslyn 分析器/源生成器中,有啥方法可以区分直接和传递程序集引用

roslyn能生成枚举吗?

使用 Roslyn SyntaxGeneration 生成带有声明的模式匹配

Roslyn代码生成,如何为给定类型创建一个类型表达式。