如何从TypeDeclarationSyntax获取TypeSyntax

时间:2017-06-20 08:34:38

标签: c# .net code-generation roslyn

我正在编写一个简单的Roslyn生成器,它生成一个接口实现,因此我想从TypeSyntax获取TypeDeclarationSyntax,因为代码如下:

// Our generator is applied to any class that our attribute is applied to.
var applyToInterface = (InterfaceDeclarationSyntax)applyTo;

// Trying to implement this interface
var clientClass = SyntaxFactory.ClassDeclaration(SyntaxFactory.Identifier(applyToInterface.Identifier.ValueText + "Client"))
    .WithModifiers(SyntaxTokenList.Create(SyntaxFactory.Token(SyntaxKind.PublicKeyword)))
    .WithBaseList(SyntaxFactory.SimpleBaseType(applyToInterface.???));

但是,除了SyntaxFactory.ParseTypeName之外,我没有看到任何创建TypeSyntax的方法。但我不想获取接口名称,然后将其转换回类型,因为可能存在错误(如泛型中的+字符而不是点等等)。

执行此操作的最方便和推荐的方法是什么?目前我正在使用

var clientClass = SyntaxFactory.ClassDeclaration(SyntaxFactory.Identifier(applyToInterface.Identifier.ValueText + "Client"))
    .WithModifiers(SyntaxTokenList.Create(SyntaxFactory.Token(SyntaxKind.PublicKeyword)))
    .AddBaseListTypes(SyntaxFactory.SimpleBaseType(SyntaxFactory.ParseTypeName(applyToInterface.Identifier.ValueText)));

但我不确定它是否总是正确的。

1 个答案:

答案 0 :(得分:1)

我相信你这样做的方式是正确的,由于Roslyn缺乏文档,我通常会检查他们的来源,使用内部示例来检查我的样本。我从搜索WithBaseList

中找到了此示例
var implementedInterfaceTypeSyntax = extractedInterfaceSymbol.TypeParameters.Any()
            ? SyntaxFactory.GenericName(
                SyntaxFactory.Identifier(extractedInterfaceSymbol.Name),
                SyntaxFactory.TypeArgumentList(SyntaxFactory.SeparatedList(extractedInterfaceSymbol.TypeParameters.Select(p => SyntaxFactory.ParseTypeName(p.Name)))))
            : SyntaxFactory.ParseTypeName(extractedInterfaceSymbol.Name);

var baseList = typeDeclaration.BaseList ?? SyntaxFactory.BaseList();
var updatedBaseList = baseList.WithTypes(SyntaxFactory.SeparatedList(baseList.Types.Union(new[] { SyntaxFactory.SimpleBaseType(implementedInterfaceTypeSyntax) })));

在这个例子中,他们使用符号来生成类型。