使用 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 分析器/源生成器中,有啥方法可以区分直接和传递程序集引用