如何使用 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)。
我想创建对“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