将程序集属性插入AssemblyInfo.cs

时间:2016-11-02 18:35:20

标签: c# roslyn

我正在试图弄清楚如何使用rosyln将装配属性插入AssemblyInfo.cs

我的属性看起来像这样:

[assembly: Foo(@"\\somepath\tosomething)"]

我可以这样读他们:

var syntaxRoot = tree.GetRoot();

var attr = syntaxRoot.DescendantNodes().OfType<AttributeSyntax>(); 
var attrNames = attr.Select(a => a.Name);
var deployments = attr.Where(a => a.Name.ToString() == "Foo")
    .Select(d => d.DescendantTokens()
    .FirstOrDefault(t => t.Kind() == SyntaxKind.StringLiteralToken).ValueText);

我可以得到传递给属性的参数。

我可以尝试插入如下属性:

var list = new List<SyntaxNode>()
{
    SyntaxFactory.AttributeList(SyntaxFactory.SeparatedList<AttributeSyntax>(new List<AttributeSyntax>()
    {
        SyntaxFactory.Attribute(SyntaxFactory.ParseName("DeploymentLocation"))
    }))
};
var n = tree.GetRoot().InsertNodesAfter(tree.GetRoot().ChildNodes().Last(), list);

这将插入一个最终看起来像这样的节点:

...
[assembly: AssemblyFileVersion("1.0.0.0")]
[DeploymentLocation]

所以它添加了我的属性,但它没有assembly:前缀,我无法弄清楚如何在那里获取字符串文字参数。

我知道我可以(并且可能应该)只加载文件并使用简单的文本编写器来插入字符串,但是为了理解Roslyn应该如何工作。

1 个答案:

答案 0 :(得分:2)

将代码粘贴到Roslyn Quoter节目中

    .WithTarget(
        AttributeTargetSpecifier(
            Token(SyntaxKind.AssemblyKeyword)))))