删除程序集:来自 AssemblyInfo.cs 的部分

Removing assembly: part from AssemblyInfo.cs

我正在使用 Rosyln 来操纵 AssemblyInfo.cs 作为我正在制作的工具的一部分,但我无法找到从文件中删除此行的正确方法:

[assembly: DeploymentLocation("\\someserver\folder")]

这个我也可以:

[assembly: DeploymentLocation("\\someserver\folder"), DeploymentLocation("\\someotherserver\folder")]

我想做的是找到那些行,删除它们,然后重新创建它们。重新创建它们很好,但删除它们是问题。

我可以找到像这样的 DeploymentLocation 件:

var attr = syntaxRoot.DescendantNodes().OfType<AttributeSyntax>().Where(a => a.Name.ToString() == "DeploymentLocation");

然后我做这样的事情:

if (attr?.Any() == true)
{
    // remove existing attributes...
    syntaxRoot = syntaxRoot.RemoveNodes(attr, SyntaxRemoveOptions.KeepNoTrivia);
}

但这最终会在我的文件中留下这个:

[assembly: ]

这显然不是我想要的。如何找到 [assembly: ] 位并删除 that 以及 DeploymentLocation 属性?显然我不想删除所有 [assembly: ] 行,因为有很多行是需要保留的样板文件。

assembly 位似乎不被认为是我在 attr 中的标签的 ParentParent)是整个文档。那么我需要做什么才能回到 assembly 部分?那位甚至叫什么?

好的,我明白了。您需要 select AttributeListSyntax,这基本上是一组方括号 [],其中包含与我想要的匹配的 AttributeSyntax 节点。然后我可以删除整个东西,其中包括 AttributeTargetSyntaxassembly: 部分),它是 AttributeSyntax

的兄弟
var attr = syntaxRoot.DescendantNodes().OfType<AttributeListSyntax>()
    .Where(a => a.DescendantNodes().OfType<AttributeSyntax>()
    .Any(s => s.Name.ToString() == "DeploymentLocation"));