我正在尝试使用Roslyn解释一些看起来像这样的代码:
public class Foo
{
public override Type BarType
{
get { return typeof(MyBar); }
}
}
我想做的是先获取
MyBar
,然后将该类型作为符号,但是我不确定这是否是可能或可行的。我将有几个看起来像这样的类,它们都从基类派生。给定
ClassDeclarationSyntax
的Foo
,我可以这样做: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
。