System.InvalidOperationException: 'Указанный элемент не является элементом списка.' - PullRequest
1 голос
/ 03 февраля 2020

Как я могу исправить этот код? Я беру исключение. Это исключение System.InvalidOperationException: «Указанный элемент не является элементом списка.»

using System;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var tree = SyntaxFactory.ParseExpression("(x + y) * z").SyntaxTree;
            var root = (BinaryExpressionSyntax)tree.GetRoot();
            foreach (var i in root.DescendantNodes())
            {
                if (i.Kind() == SyntaxKind.IdentifierName)
                {
                    string str = "64";
                    var subTree = SyntaxFactory.ParseExpression(str).SyntaxTree;
                    var subRoot = (LiteralExpressionSyntax)subTree.GetRoot();
                    var subNode = subRoot.DescendantNodes().OfType<LiteralExpressionSyntax>();
                    var newRoot = root.ReplaceNode(root.FindNode(i.Span), subNode);
                    Console.WriteLine(newRoot);
                }
            }
            Console.ReadLine();
        }
    }
}

1 Ответ

0 голосов
/ 04 февраля 2020

Я решаю эту проблему следующим образом

using System;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var tree = SyntaxFactory.ParseExpression("(x + y) * z").SyntaxTree;
            var root = (BinaryExpressionSyntax)tree.GetRoot();
            foreach (var i in root.DescendantNodes())
            {
                if (i.Kind() == SyntaxKind.IdentifierName)
                {
                    string str = "64";
                    var subTree = SyntaxFactory.ParseExpression(str).SyntaxTree;
                    var subRoot = (LiteralExpressionSyntax)subTree.GetRoot();
                    var newRoot = SyntaxNodeExtensions.ReplaceNode(root, i, subRoot);
                    Console.WriteLine(newRoot);
                }
            }
            Console.ReadLine();
        }
    }
}
...