如何使用Roslyn操作CSHTML

时间:2019-11-08 14:28:08

标签: c# .net razor roslyn

我正在尝试使用Roslyn对我的代码进行一些大规模重构。

想法是删除特定的用法,并将其直接插入代码中。

例如

using My.Awesome.Namespace;
...
var temp = MyType.Prop;

将成为

var temp = My.Awesome.Namespace.MyType.Prop;

我已经有了使用MSBuildWorkspace来解析.cs文件的有效解决方案,以解析我的解决方案,找到正在使用的引用并将其替换在文件中。但是我找不到如何在cshtml文件中执行相同的操作。

它们没有出现在我项目的Documents属性中。

有什么主意吗?

这是我用来解析解决方案的代码

public void Process(string solutionPath, string projectName, string baseNamespace)
{
    //Force import csharp projects
    MSBuildLocator.RegisterDefaults();
    var _ = typeof(Microsoft.CodeAnalysis.CSharp.Formatting.CSharpFormattingOption
    using (var msWorkspace = MSBuildWorkspace.Create())
    {
        var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;

        var project = solution.Projects.FirstOrDefault(x => x.Name == projectName)
        if (project == null)
            throw new InvalidOperationException();

        foreach (var document in project.Documents)
        {
            if (document.SourceCodeKind != SourceCodeKind.Regular)
                continue;

            Console.WriteLine("Fixing file " + document.Name);

            // Remove using of baseNamespace from doc
            var newDoc = RemoveUsing(document, baseNamespace);
            solution = solution.WithDocumentSyntaxRoot(document.Id, newDoc);
        }
        msWorkspace.TryApplyChanges(solution);
    }

}

1 个答案:

答案 0 :(得分:0)

这是一个不错的解决方案,用于扫描,解析,编译和获取解决方案的.cshtml文件的语义模型:Getting a SemanticModel of a cshtml file?