我正在使用 Roslyn 解析一些 C# 文件,以生成 TypeScript 类型。
var source = System.IO.File.ReadAllText(pathToCSharpFile);
var tree = CSharpSyntaxTree.ParseText(source);
var root = (CompilationUnitSyntax) tree.GetRoot();
我从根开始递归地遍历树以获取有关属性、字段和嵌套类的信息。
namespace MyNamespace
{
public class Foo
{
public Bar BarProp { get; set; }
public Baz BazProp { get; set; }
public class Bar
{
}
}
}
TypeScript对此的定义必须变成:
interface Foo {
barProp: Foo.Bar;
bazProp: Baz;
}
namespace Foo {
interface Bar {
}
}
令我困惑的是如何确定 BarProp 的类型是嵌套类,以便在 TypeScript 定义中正确指定 barProp 的类型。
使用 PropertyDeclarationSyntax、FieldDeclarationSyntax 和 ClassDeclarationSyntax 时此信息是否可用,或者我是否需要使用不同的方法来推断正确的类型?
CSharpSyntaxWalker
来分析类声明(它将为您执行递归树遍历,您只需覆盖 VisitXXX
,其中 XXX 是您要分析的节点)。如果该类声明不在命名空间声明中1,那么它是一个嵌套类:
public class Walker : CSharpSyntaxWalker
{
public override void VisitClassDeclaration(ClassDeclarationSyntax node)
{
if (!(node.Parent is NamespaceDeclarationSyntax))
{
// Code to apply to nested classes
}
base.VisitClassDeclaration(node);
}
}
为了让它走遍你的节点,你只需要做
new Walker().Visit(root);
1您还可以处理顶级语句或在全局命名空间中声明的类,在这种情况下,
node.Parent
似乎是CompilationUnitSyntax
,至少当我使用您问题的代码时创建语法树