使用开源发布的"roslyn"来读取代码文件并生成新的代码文件

Pou*_*sen 7 c# roslyn

我从哪里开始?

在我目前的解决方案中,我有这样的模型:

public class MyAwesomeModel
{
 ....
}
Run Code Online (Sandbox Code Playgroud)

我想采用roslyn代码项目来解析源文件并遍历语法树以生成新的代码文件.获取这些源文件并将它们添加到ac #project文件中,以便在visual studio中再次导入我的解决方案.

我从哪里开始.克隆roslyn并写一个控制台应用程序,引用所有roslyn并开始挖掘roslyn以了解如何,或者是否有任何博客,documentatino显示这样的东西.

Pou*_*sen 5

这有点容易做到。

创建一个控制台应用程序并在您的项目中添加对Microsoft.CodeAnalysis.CSharp 的引用。

这是访问源文本中所有属性的程序:

using System;
using System.Collections.Generic;
using System.Text.Json;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

class ModelCollector : CSharpSyntaxWalker
{
    public Dictionary<string, List<string>> Models { get; } = new Dictionary<string, List<string>>();
    public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node)
    {
        var classnode = node.Parent as ClassDeclarationSyntax;
        if (!Models.ContainsKey(classnode.Identifier.ValueText))
        {
            Models.Add(classnode.Identifier.ValueText, new List<string>());
        }

        Models[classnode.Identifier.ValueText].Add(node.Identifier.ValueText);
    }
}

class Program
{
    static void Main()
    {
        var code = @"
                using System;
                using System.Collections.Generic;
                using System.Linq;
                using System.Text;

                namespace HelloWorld
                {
                    public class MyAwesomeModel
                    {
                        public string MyProperty {get;set;}
                        public int MyProperty1 {get;set;}
                    }

                }";

        var tree = CSharpSyntaxTree.ParseText(code);

        var root = (CompilationUnitSyntax)tree.GetRoot();
        var modelCollector = new ModelCollector();
        modelCollector.Visit(root);

        Console.WriteLine(JsonSerializer.Serialize(modelCollector.Models));
    }
}
Run Code Online (Sandbox Code Playgroud)