如何使用 Roslyn 创建泛型类型引用?

How to create generic type reference with Roslyn?

我想创建对“System.IEquatable<MyType>”的引用,其中可以通过 typeof 访问开放通用类型,通用参数仅作为文本。如何创建正确的 NameSyntax 可以用作字段类型等?

我们最近使用 SF.ParseName 创建了一个 QualifiedNameSyntax(不是 GenericNameSyntax 让我感到奇怪)。但是,我认为这并不理想,因为我自己处理 <> 和 string.Join。

您可以使用以下模式:

SF.GenericName(
    SF.Identifier(@"IEquatable"))
.WithTypeArgumentList(
    SF.TypeArgumentList(/.../))

如果您在工作区层执行此操作,您还可以使用 SyntaxGenerator 类型以独立于语言的方式执行此操作:

var generator = SyntaxGenerator.GetGenerator(document);
generator.QualifiedName(generator.IdentifierName("System"),
                        generator.GenericName(generator.IdentifierName("IEquatable"), 
                                              new [] { generator.IdentifierName("MyType") }));

这将为 C# 生成 System.IEquatable 并为 VB 文档生成 System.IEquatable(Of MyType)。