gpt4 book ai didi

c# - 如何在保留琐事的同时替换节点?

转载 作者:行者123 更新时间:2023-11-30 16:59:41 25 4
gpt4 key购买 nike

我正在尝试转换 IEnumerable<object[]>属性(property)

public IEnumerable<object[]> BeforeConversion
{
get
{
yield return new object[] { new DateTime(2013, 8, 23), new DateTime(2013, 09, 15) };
yield return new object[] { new DateTime(2013, 9, 20), new DateTime(2013, 10, 15) };
}
}

object[]字段

static object[] AfterConversion =
{
new object[] { new DateTime(2013, 8, 23), new DateTime(2013, 09, 15) },
new object[] { new DateTime(2013, 9, 20), new DateTime(2013, 10, 15) },
};

这是我的尝试:

var testCases = node.DescendantNodes((_) => true).OfType<ArrayCreationExpressionSyntax>()
.Select(i => ((ExpressionSyntax)i))
.ToArray();

var arrayType = node.DescendantNodes((_) => true).OfType<ArrayTypeSyntax>().First();

var seperators = Enumerable.Repeat(SyntaxFactory
.Token(SyntaxKind.CommaToken)
.WithTrailingTrivia(LineFeed), testCases.Length);
var initializerNode = SyntaxFactory
.ArrayCreationExpression(arrayType)
.WithInitializer(SyntaxFactory
.InitializerExpression(SyntaxKind.ArrayInitializerExpression)
.WithExpressions(SyntaxFactory.SeparatedList(testCases, seperators)));

return SyntaxFactory.FieldDeclaration(
new SyntaxList<AttributeListSyntax>(),
SyntaxFactory.TokenList().Add(
SyntaxFactory.Token(SyntaxKind.StaticKeyword).WithTrailingTrivia(Space)),
SyntaxFactory.VariableDeclaration(arrayType.WithTrailingTrivia(Space),
SyntaxFactory.SeparatedList<VariableDeclaratorSyntax>().Add(
SyntaxFactory.VariableDeclarator(newName).WithInitializer(
SyntaxFactory.EqualsValueClause(
SyntaxFactory.Token(SyntaxKind.EqualsToken).WithLeadingTrivia(Space),
initializerNode)))))
.WithLeadingTrivia(node.GetLeadingTrivia())
.WithTrailingTrivia(node.GetTrailingTrivia());

这个实现产生

static object[] TestGetExpirationDateCases =newobject[]{new object[] { new DateTime(2013, 8, 23), new DateTime(2013, 09, 15) },
new object[] { new DateTime(2013, 9, 20), new DateTime(2013, 10, 15) },
};

格式很不对。 newobject[] 是一个单词而不是 new object[]。实际上根本不需要它,但我不知道如何在没有它的情况下创建初始化语句。

我的问题是:
1.有没有什么办法可以快速格式化?
2.有没有更好的方法来做到这一点。试图让所有细节都完美无缺似乎很费时间。

最佳答案

  1. 要创建具有隐式类型的数组,请使用 ImplicitArrayCreationExpression 而不是 ArrayCreationExpression:

    var initializerNode = SyntaxFactory
    .ImplicitArrayCreationExpression(SyntaxFactory
    .InitializerExpression(SyntaxKind.ArrayInitializerExpression)
    .WithExpressions(SyntaxFactory.SeparatedList(testCases, seperators)));
  2. 您可以使用 Formatter 格式化您新创建的语法。假设您已将实现的返回结果分配给变量 result,那么您可以这样调用它:

    using Microsoft.CodeAnalysis.Formatting;

    var formattedResult = Formatter.Format(result, workspace);

    这会为您的示例生成格式良好的输出(我已将名称硬编码为“after”):

    static object[] after = new[]
    {
    new object[] { new DateTime(2013, 8, 23), new DateTime(2013, 09, 15) },
    new object[] { new DateTime(2013, 9, 20), new DateTime(2013, 10, 15) },
    };
  3. 你应该试试 Roslyn Syntax Visualizer Tool (查看 > 其他窗口 > Roslyn 语法可视化工具)。它允许您查看 Roslyn 为当前文档中的给定代码片段创建的语法节点。当您试图找出如何正确构建自己的树时,这通常会有很大帮助!

关于c# - 如何在保留琐事的同时替换节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23438011/

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