gpt4 book ai didi

c# - 使用 Roslyn 将类(class)成员添加到特定位置?

转载 作者:太空狗 更新时间:2023-10-29 18:36:02 25 4
gpt4 key购买 nike

我正在使用 ClassDeclarationSyntax.AddMembers 方法将私有(private)字段添加到类中。字段出现在类中,但我想知道如何将字段添加到特定位置。截至目前,它们被添加到 #if 指令内的类末尾,该指令恰好在运行代码生成时评估为 true。

运行代码:

var tree = SyntaxTree.ParseCompilationUnit(@"
namespace Test
{
public class A
{
#if !SILVERLIGHT
public int someField;
#endif
}
}");
var field =
Syntax.FieldDeclaration(
Syntax.VariableDeclaration(
Syntax.PredefinedType(
Syntax.Token(
SyntaxKind.StringKeyword))))
.WithModifiers(Syntax.Token(SyntaxKind.PrivateKeyword))
.AddDeclarationVariables(Syntax.VariableDeclarator("myAddedField"));
var theClass = tree.GetRoot().DescendantNodes()
.OfType<ClassDeclarationSyntax>().First();
theClass = theClass.AddMembers(field).NormalizeWhitespace();
System.Diagnostics.Debug.Write(theClass.GetFullText());

将产生这样的结果:

public class A
{
#if !SILVERLIGHT
public int someField;
private string myAddedField;
#endif
}

我想得到这个结果:

public class A
{
private string myAddedField;
#if !SILVERLIGHT
public int someField;
#endif
}

最佳答案

为此,您必须确定要放置新成员的确切位置,然后相应地修改类成员列表。像这样的东西:

private static SyntaxList<MemberDeclarationSyntax> AddBeforeIfDirective(
SyntaxList<MemberDeclarationSyntax> oldMembers,
MemberDeclarationSyntax newMember)
{
var ifIndex = oldMembers.IndexOf(
member => member.GetLeadingTrivia()
.Any(t => t.Kind == SyntaxKind.IfDirective));
return oldMembers.Insert(ifIndex, newMember);
}




var newMembers = AddBeforeIfDirective(theClass.Members, field);

theClass = theClass.WithMembers(newMembers).NormalizeWhitespace();

关于c# - 使用 Roslyn 将类(class)成员添加到特定位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12396989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com