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个属性时
,包含分隔符,然后在换行符处出现前导空格。