Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Roslyn访问和修改解决方案中的所有文档_C#_Roslyn - Fatal编程技术网

C# 使用Roslyn访问和修改解决方案中的所有文档

C# 使用Roslyn访问和修改解决方案中的所有文档,c#,roslyn,C#,Roslyn,我想使用Roslyn浏览给定解决方案中每个项目中的所有文档 这是我现在拥有的代码: var msWorkspace = MSBuildWorkspace.Create(); var solution = await msWorkspace.OpenSolutionAsync(solutionPath); foreach (var project in solution.Projects) { foreach (var document in project.Documents)

我想使用Roslyn浏览给定解决方案中每个项目中的所有文档

这是我现在拥有的代码:

var msWorkspace = MSBuildWorkspace.Create();
var solution = await msWorkspace.OpenSolutionAsync(solutionPath);
foreach (var project in solution.Projects)
{
    foreach (var document in project.Documents)
    {
        if (document.SourceCodeKind != SourceCodeKind.Regular)
            continue;

        var doc = document;
        foreach (var rewriter in rewriters)
        {
            doc = await rewriter.Rewrite(doc);
        }

        if (doc != document)
        {
            Console.WriteLine("changed {0}",doc.Name);
            //save result

            //the solution is now changed and the next document to be processed will belong to the old solution
            msWorkspace.TryApplyChanges(doc.Project.Solution);
        }                    
    }
}
这里的问题是,由于Roslyn在很大程度上是不变的。 在第一个“msWorkspace.TryApplyChanges”之后,解决方案和文档现在被新版本替换

因此,下一次迭代仍将遍历旧版本。 有没有办法用Roslyn惯用的方式来做到这一点?
或者我必须求助于一些
(int projectIndex=0;projectIndex
黑客吗?

Roslyn gitter聊天中发布的这个解决方案起到了作用并解决了问题

var solution = await msWorkspace.OpenSolutionAsync(solutionPath);

foreach (var projectId in solution.ProjectIds)
{
    var project = solution.GetProject(projectId);
    foreach (var documentId in project.DocumentIds)
    {
        Document document = project.GetDocument(documentId);

        if (document.SourceCodeKind != SourceCodeKind.Regular)
            continue;

        var doc = document;
        foreach (var rewriter in rewriters)
        {
            doc = await rewriter.Rewrite(doc);

        }

        project = doc.Project;
    }
    solution = project.Solution;
}
msWorkspace.TryApplyChanges(solution);
在这种情况下,在迭代之间不再放弃更改,因为所有内容都建立在上一次迭代的结果之上。
(也就是说,文档和项目是通过ID而不是从遍历原始结构的枚举器中获取的)

我不知道Roslyn的情况,但看看代码,为什么你不能将TryApplyChanges移到循环外?不,因为新修改的文档有一个新的修改解决方案,如果在循环后应用,所有对文档的更改都会消失。你不需要
if(doc!=document)