【发布时间】:2019-11-23 22:06:12
【问题描述】:
使用 Roslyn,我试图解释一些看起来像这样的代码:
public class Foo
{
public override Type BarType
{
get { return typeof(MyBar); }
}
}
我想做的是获取MyBar,然后获取该类型作为符号,但我不确定这是否可行或实际可行。我将有几个看起来像这样的类,它们都派生自一个基类。
鉴于Foo 的ClassDeclarationSyntax,我可以这样做:
var prop = syntax.DescendantNodes().OfType<PropertyDeclarationSyntax>()
.FirstOrDefault(p => p.Identifier.ToString() == "BarType");
或者给定INamedTypeSymbol for 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,它似乎没有GetTypeSymbol 方法。
【问题讨论】: