在Roslyn中获取预定义的方法

问题描述 投票:0回答:1

我是C#和Roslyn的新手。

我试图找到使用Roslyn在代码块中调用哪些方法(不是动态调用只是一个静态信息,这里存在一些函数调用)。

Roslyn有MethodDeclarationSyntax来获取方法的标识符,但我似乎找不到任何方法来获取预定义方法的标识符。

我的程序文件如下。

Program.cs中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.MSBuild;
using Microsoft.CodeAnalysis.Text;

namespace CodeAnalysisApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            SyntaxTree tree = CSharpSyntaxTree.ParseText(
            @"using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Text;
            using Microsoft.CodeAnalysis;
            using Microsoft.CodeAnalysis.CSharp;

            namespace TopLevel
            {
                public void hello()
                {
                    int x;
                    Console.Writeline(x);

                }
                public void bye () {int y;}
                using Microsoft;
                using System.ComponentModel;

                namespace Child1
                {
                    using Microsoft.Win32;
                    using System.Runtime.InteropServices;

                    class Foo { }
                }

                namespace Child2
                {
                    using System.CodeDom;
                    using Microsoft.CSharp;

                    class Bar { }
                }
            }");

            var root = (CompilationUnitSyntax)tree.GetRoot();

            var walker = new UsingCollector();
            walker.Visit(root);
            foreach (var node in walker.usings)
            {
                Console.WriteLine(node.Name);
            }
            foreach (var node in walker.methods)
            {
                Console.WriteLine(node.Identifier);
            }
            foreach (var node in walker.pref)
            {
                Console.WriteLine(node.Keyword);
            }

            Console.ReadKey();
        }
    }
}

使用Collector.ca:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace CodeAnalysisApp1
{
    class UsingCollector : CSharpSyntaxWalker
    {
        public readonly List<UsingDirectiveSyntax> usings = new List<UsingDirectiveSyntax>();
        public readonly List<MethodDeclarationSyntax> methods = new List<MethodDeclarationSyntax>();
        public readonly List<PredefinedTypeSyntax> pref = new List<PredefinedTypeSyntax>();
        public override void VisitUsingDirective(UsingDirectiveSyntax node)
        {
            if(node.Name.ToString() != "System" && !node.Name.ToString().StartsWith("System."))
            {
                this.usings.Add(node);
            }
        }


        public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
        {
            this.methods.Add(node);
        }

        public override void VisitPredefinedType(PredefinedTypeSyntax node)
        {
            this.pref.Add(node);
        }
    }
}
c# roslyn
1个回答
0
投票

听起来你实际上是在试图获取方法调用,而不是方法定义。使用Visual Studio中的语法Visualiser来查看解析任何给定表达式的语法节点。

在你的情况下,你想要InvocationExpressionSyntax

© www.soinside.com 2019 - 2024. All rights reserved.