这是一个难以回答的问题,因为你必须学习从"安装Roslyn"到"重写源代码"的一些事情.没有官方文档,但我已经在Learn Roslyn Now中学习了API,因此我一直在跟踪我的进度.
重要主题:
Roslyn被部署为NuGet包,您可以通过以下方式安装到项目中:
Install-Package Microsoft.CodeAnalysis
Run Code Online (Sandbox Code Playgroud)
有关更多信息(包括有关安装帮助程序工具的视频),请参阅第1部分:安装Roslyn.
语法树API是了解Roslyn新用户最重要的概念.作为程序员,我们习惯于以字符串的形式处理源代码,我们直接操作它们.在幕后,编译器接受这些字符串并将它们转换为树结构.
例如,以下代码:
class SimpleClass
{
public void SimpleMethod()
{
}
}
Run Code Online (Sandbox Code Playgroud)
表示为以下语法树:
蓝色节点表示a SyntaxNode,绿色节点表示a SyntaxToken.SyntaxNodes是树的内部节点,可以分解成更小的部分.SyntaxTokens是语法树的基本单位,不能分解成更小的部分.(你不能破坏{或public变成更小的东西).
注意a SyntaxTree是不可变的也很重要.这意味着我们无法直接更改树.相反,我们必须根据原始树创建一个新树,但应用我们的更改.
让我们把它们放在一起并重命名一个方法:
var tree = CSharpSyntaxTree.ParseText(@"
class MyClass
{
void MyMethod()
{
}
}");
//We navigate these trees by getting the root, and then
//searching up and down the tree for the nodes we're interested in.
var root = tree.GetRoot();
var method = root.DescendantNodes().OfType<MethodDeclarationSyntax>().Single();
//Let's create a new method with a different name
var newIdentifier = SyntaxFactory.Identifier("MyNewMethodWithADifferentName");
//NOTE: We're creating a new tree, not changing the old one!
var newMethod = method.WithIdentifier(newIdentifier);
Console.WriteLine(newMethod);
Run Code Online (Sandbox Code Playgroud)
在这一点上,我们真的只是触及了表面.还有其他一些方法可以重写源代码,包括:
DocumentEditor-参见:/sf/answers/2139456861/Annotations (第235和239行).TrackNodes()CSharpSyntaxRewriter,在一个自下而上的方法代替节点.我在博客上写过这篇文章.Roslyn API具有绝对巨大的表面积.您可以使用数千种公共类型和方法.一开始它可能非常压倒性,但我发现几乎任何我想对源代码做的事情都可以通过Roslyn完成.这是一个非常强大的工具.
| 归档时间: |
|
| 查看次数: |
3403 次 |
| 最近记录: |