【问题标题】:How to get full name path for method call/class declaration using Roslyn如何使用 Roslyn 获取方法调用/类声明的全名路径
【发布时间】:2016-05-31 18:50:01
【问题描述】:

如何使用 Roslyn 获取方法调用的完整限定名?

例如, Request.QueryString,来自System.Web.UI,我怎么能检测到?

如何在同一个项目中声明类但不同的命名空间? 以及来自同一项目的其他类的函数调用。

感谢任何形式的帮助,谢谢!

【问题讨论】:

    标签: c# analysis roslyn roslyn-code-analysis


    【解决方案1】:

    您应该为您的所有项目文件创建所有SyntaxTree 的编译。之后,您可以对任何节点使用符号信息:

    static string Code =
    @"namespace TestNamespace
    {
        public class Test
        {
            public int A { get; set; }
            public int B { get; set; }
    
            public Test(int a, int b)
            {
                A = a;
                B = b;
            }
        }
    }";
    
    static void Main(string[] args)
    {
        var syntaxTree = CSharpSyntaxTree.ParseText(Code);
        var syntaxTrees = new SyntaxTree[] { syntaxTree }; // Add SyntaxTree array from project files.
        var compilation = CSharpCompilation.Create("tempAssembly", syntaxTrees);
        var semanticModel = compilation.GetSemanticModel(syntaxTree);
        var caretPosition = 46;
        var symbol = SymbolFinder.FindSymbolAtPositionAsync(semanticModel, caretPosition, new AdhocWorkspace()).Result;
        var fullName = symbol.ToString(); // fullName is "TestNamespace.Test"
    }
    

    【讨论】:

    • 谢谢!有没有关于符号的好的教程/指南? roslyn 教程对我理解符号及其用法没有多大帮助。
    • 如果我调用具有多个标识符的函数调用,例如test.ToString().ToUpper().Contains("asd") , Roslyn 的 Symbol API / Semantic Modeling 如何帮助我分析这个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2016-11-09
    相关资源
    最近更新 更多