【发布时间】:2014-05-15 02:07:42
【问题描述】:
我希望从模块的 roslyn 语义模型中获取祖先。
在这样的课程中:
namespace Name1.Name2
{
using System;
...
public partial class MyClass : Ancestor<Param1, Param2>
{
}
}
所以我正在尝试获取Ancestor<Param1, Param2>(以及后来的Param1 和Param2)。
我正在使用这段代码来创建语义模型:
SyntaxTree tree = CSharpSyntaxTree.ParseFile(moduleAutoGenPath);
CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot();
var nameSpace = ((NamespaceDeclarationSyntax)(root.Members[0])).Name.ToString();
var compilation = CSharpCompilation.Create(nameSpace, new[] { tree }).AddReferences(new MetadataFileReference(typeof(object).Assembly.Location));
我正在查看compilation.Assembly.Modules,但没有找到祖先..
我走在好的路上吗?还是完全迷路了?
【问题讨论】:
-
您要查找的是 baseclasses 或 superclasses,而不是“模块祖先”(我假设这是您在另一种语言中使用的术语)。我不确定您是否走对了路,但是通过访问类中的任何类型的节点,您可以使用此代码来获取您的超类:
someNode.Ancestors().OfType<ClassDeclarationSyntax>().FirstOrDefault().BaseList.Types我假设您可以转身寻找从另一个方向。 -
你说得对,祖先是基类。因此,如果我这样做
root.DescendantNodes().OfType<ClassDeclarationSyntax>().FirstOrDefault()我可以从 syntaxTree 中获取信息。