我正在尝试使用Roslyn解释一些看起来像这样的代码:

public class Foo
{
    public override Type BarType
    {
        get { return typeof(MyBar); }
    }
}


我想做的是先获取MyBar,然后将该类型作为符号,但是我不确定这是否是可能或可行的。我将有几个看起来像这样的类,它们都从基类派生。

给定ClassDeclarationSyntaxFoo,我可以这样做:

var prop = syntax.DescendantNodes().OfType<PropertyDeclarationSyntax>()
              .FirstOrDefault(p => p.Identifier.ToString() == "BarType");


或为INamedTypeSymbol指定Foo,我可以这样做:

var member = symbol.GetMembers("BarType").FirstOrDefault();


但是我不知道从那里去哪里。

最终,我希望能够获得MyBar的符号以进行进一步的分析,因此,即使获取字符串"MyBar"也可能无济于事,因为它并不完全合格。

有什么建议么?

编辑:

我正在得到一个项目和一个这样的编译:

var workspace = MSBuildWorkspace.Create();
var project = workspace.OpenProjectAsync(projectPath).Result;
var compilation = project.GetCompilationAsync().Result;


compilation是此处的CSharpCompilation。从那里我做这样的事情:

foreach (var doc in project.Documents)
{
    Console.WriteLine($"Analyzing {doc.Name}");

    //var model = doc.GetSemanticModelAsync().Result;
    var tree = doc.GetSyntaxTreeAsync().Result;
    var root = tree.GetRoot();
    var model = compilation.GetSemanticModel(tree);
    var classes = root.DescendantNodes().OfType<ClassDeclarationSyntax>();

    foreach (var syntax in classes)
    {
        var symbol = model.GetDeclaredSymbol(syntax);
        //... need to analyze properties in the class here...
    }
}


无论哪种方式,我都会得到一个model,它似乎没有一个SyntaxTreeSemanticModel方法。

最佳答案

您需要语义模型,该模型来自Compilation(带有参考和配置)。

然后,您可以在该节点上调用GetTypeSymbol() GetSymbolInfo()并强制转换为INamedTypeSymbol

08-17 17:50