C# 如何删除所有成员属性,但留下空行?

C# 如何删除所有成员属性,但留下空行?,c#,roslyn,C#,Roslyn,我已经编写了一个CSharpSyntaxRewriter,用于从方法中删除属性,但是当我从方法中删除所有属性时,我很难保留属性之前的任何内容(直到上一个方法) 这非常适用于具有多个属性的方法,但不仅仅适用于一个属性 这里有一个小程序: void Main() { var code = @"namespace P { class Program { public void NoAttributes() { } //??? [T

我已经编写了一个
CSharpSyntaxRewriter
,用于从方法中删除属性,但是当我从方法中删除所有属性时,我很难保留属性之前的任何内容(直到上一个方法)

这非常适用于具有多个属性的方法,但不仅仅适用于一个属性

这里有一个小程序:

void Main()
{
    var code = @"namespace P
{
    class Program
    {
        public void NoAttributes() { }
        //???
        [TestCategory(""Atomic"")]
        public void OneAtt1() { }

        [TestCategory(""Atomic"")]
        public void OneAtt2() { }

        [TestMethod, TestCategory(""Atomic"")]
        public void TwoAtts() { }
    }
}";
    var tree = CSharpSyntaxTree.ParseText(code);
    var rewriter = new AttributeRemoverRewriter();

    var rewrittenRoot = rewriter.Visit(tree.GetRoot());

    Console.WriteLine(rewrittenRoot.GetText().ToString());
}

public class AttributeRemoverRewriter : CSharpSyntaxRewriter
{
    public override SyntaxNode VisitAttributeList(AttributeListSyntax attributeList)
    {
        var nodesToRemove =
            attributeList
            .Attributes
            .Where(att => (att.Name as IdentifierNameSyntax).Identifier.Text.StartsWith("TestCategory"))
            .ToArray();

        if (nodesToRemove.Length == attributeList.Attributes.Count)
        {
            //Remove the entire attribute
            return
                attributeList
                .RemoveNode(attributeList, SyntaxRemoveOptions.KeepNoTrivia);
        }
        else
        {
            //Remove just the matching ones recursively
            foreach (var node in nodesToRemove)
                return
                    VisitAttributeList(attributeList.RemoveNode(node, SyntaxRemoveOptions.KeepNoTrivia));
        }

        return
            base.VisitAttributeList(attributeList);
    }
}
完整版本在我的网站上(在任何人指出任何其他问题之前)

预期产出为:

namespace P
{
    class Program
    {
        public void NoAttributes() { }
        //???

        public void OneAtt1() { }

        public void OneAtt2() { }

        [TestMethod]
        public void TwoAtts() { }
    }
}
namespace P
{
  class Program
  {
    public void NoAttributes() { }
    public void OneAtt1() { }
    public void OneAtt2() { }

    [TestMethod]
    public void TwoAtts() { }
  }
}
实际产出为:

namespace P
{
    class Program
    {
        public void NoAttributes() { }
        //???

        public void OneAtt1() { }

        public void OneAtt2() { }

        [TestMethod]
        public void TwoAtts() { }
    }
}
namespace P
{
  class Program
  {
    public void NoAttributes() { }
    public void OneAtt1() { }
    public void OneAtt2() { }

    [TestMethod]
    public void TwoAtts() { }
  }
}
关于我需要做些什么来保留空白(甚至是注释!!)有什么想法吗


我把我能想到的
琐事的每一个组合都搞砸了。更改
SyntaxRemoveOptions
会导致Roslyn代码库中出现
NullReferenceException
s,并且使用
*琐事
扩展方法会导致属性不再被删除-只是空白。

就像我在评论中所说的那样,在我看来这就像Roslyn中的一个bug。如果愿意,您可以报告它并使用以下解决方法

我只是尝试在方法级别而不是属性级别重写。(您可以对属性使用类似的方法)


您将丢失属性之间的琐事。在构建重写器时,琐事是最难纠正的事情之一。

这些异常对我来说似乎是错误。我只是在本地复制了它们,我不认为更改
SyntaxRemoveOptions
会导致异常。您应该在以下位置创建一个问题:谢谢Josh,我不担心那些晦涩的琐事,但我想我会在github上为团队记录一个问题。刚刚注意到这修复了我在发布问题后发现的另一个问题,当有人在
[]中声明2个属性时
,包含分隔符,然后在换行符处出现前导空格。