【问题标题】:How to manipulate CSHTML with Roslyn如何使用 Roslyn 操作 CSHTML
【发布时间】:2019-11-08 14:28:08
【问题描述】:

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

这个想法是删除一个特定的使用并将它们直接插入到代码中。

例如

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

会变成

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

我已经有了 .cs 文件的有效解决方案,使用 MSBuildWorkspace 解析我的解决方案,找到使用参考并在文件中替换它们。但我找不到如何对 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);
    }

}

【问题讨论】:

  • 我很好奇:是什么促使您删除顶部的 usings 并在任何地方插入命名空间?是风格选择吗?我没有提供任何论据,只是好奇。
  • 我们正在从资源迁移到 po 来翻译我们的应用程序。我们所有的资源都在“Project.Translations”文件夹中。大多数情况下,我们使用带有命名空间的完整路径来引用代码中的资源。但有时我们确实使用了 Project.Translations。因此,作为第一步,我只想用完整路径替换它们。

标签: c# .net razor roslyn


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多