gpt4 book ai didi

c# - 使用 Roslyn 解析/转换/生成代码 : am I aiming too high, 还是太低?

转载 作者:IT王子 更新时间:2023-10-29 04:30:50 26 4
gpt4 key购买 nike

(我想做的是通过从 vs 生成的设置文件生成接口(interface)和包装类来解决 Application.Settings/MVVM 问题。)

我想做的是:

  • 从文件中解析类声明
  • 仅根据类的(非静态)属性生成接口(interface)声明
  • 生成一个实现此接口(interface)的包装类,在构造函数中获取原始类的一个实例,并将所有属性“通过管道”传递给该实例。
  • 生成另一个直接实现接口(interface)的类。

我的问题有两个:

  • 我是不是找错了树?为此或部分使用 Code-Dom、T4、Regex(!) 会更好吗? (我不介意做一些额外的工作,因为这主要是一种学习体验。)
  • 如果 Roslyn 是可行的方法,我应该关注它的哪一部分?我有点天真地希望有某种方法可以遍历树并吐出我想要的位,但我无法理解是否/如何使用 SyntaxRewriter 来完成它,或者是否要使用流畅的结构,多次查询源代码以获得我需要的位。

如果您想对 MVVM 方面发表评论,您可以,但这不是问题的主旨:)

最佳答案

如果你的需求是解析C#源码,那么我觉得Roslyn是一个不错的选择。如果您要将它用于这部分,我认为将它用于代码生成也很有意义。

使用 Roslyn 生成代码可能会非常冗长(尤其是与 CodeDom 相比时),但我认为这对您来说不是什么大问题。

我认为 SyntaxRewriter 最适合在代码中进行本地化更改。但是你问的是解析整个类并基于它生成类型,我认为为此,直接查询语法树效果最好。

例如,为类中的所有属性生成只读接口(interface)的最简单示例可能如下所示:

var originalClass =
compilationUnit.DescendantNodes().OfType<ClassDeclarationSyntax>().Single();
string originalClassName = originalClass.Identifier.ValueText;
var properties =
originalClass.DescendantNodes().OfType<PropertyDeclarationSyntax>();

var generatedInterface =
SyntaxFactory.InterfaceDeclaration('I' + originalClassName)
.AddMembers(
properties.Select(
p =>
SyntaxFactory.PropertyDeclaration(p.Type, p.Identifier)
.AddAccessorListAccessors(
SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))))
.ToArray());

关于c# - 使用 Roslyn 解析/转换/生成代码 : am I aiming too high, 还是太低?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16338131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com