使用 Roslyn 生成“只读记录结构”

问题描述 投票:0回答:1

我无法使用 Roslyn 生成只读记录结构。

我的代码:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;

var tree = SyntaxFactory.CompilationUnit()
    .AddMembers(
            SyntaxFactory.RecordDeclaration(
                SyntaxFactory.Token(SyntaxKind.RecordKeyword),
                SyntaxFactory.Identifier("A"))
            .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))
            .AddModifiers(
                        SyntaxFactory.Token(SyntaxKind.PublicKeyword),
                        SyntaxFactory.Token(SyntaxKind.ReadOnlyKeyword))
            .WithClassOrStructKeyword(
                SyntaxFactory.Token(SyntaxKind.StructKeyword))
            .WithParameterList(
                SyntaxFactory.ParameterList()))
    .NormalizeWhitespace();

Console.WriteLine(tree.ToFullString());

var refApis = AppDomain.CurrentDomain.GetAssemblies()
    .Where(a => !a.IsDynamic)
    .Select(a => MetadataReference.CreateFromFile(a.Location));

var options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);

var compilation = CSharpCompilation.Create("something", new SyntaxTree[] { tree.SyntaxTree }, refApis, options);
var diag = compilation.GetDiagnostics().Where(e => e.Severity == DiagnosticSeverity.Error).ToList();

foreach (var d in diag)
{
    Console.WriteLine(d);
}

Console.ReadLine();

我得到这样的结果“public readonly record struct A();” 和这样的错误“(1,31):错误CS0106:“只读”修饰符对此元素无效。”

c# .net roslyn code-analysis .net-7.0
1个回答
0
投票

问题是您正在创建的记录声明具有

SyntaxKind.RecordDeclaration
而不是
SyntaxKind.RecordStructDeclaration
。即使您添加 struct 关键字,它也不会更改最初创建的 SyntaxKind。要解决此问题,您需要执行以下操作:

            SyntaxFactory.RecordDeclaration(
                SyntaxKind.RecordStructDeclaration,
                SyntaxFactory.Token(SyntaxKind.RecordKeyword),
                SyntaxFactory.Identifier("A"))

而不是

            SyntaxFactory.RecordDeclaration(
                SyntaxFactory.Token(SyntaxKind.RecordKeyword),
                SyntaxFactory.Identifier("A"))
© www.soinside.com 2019 - 2024. All rights reserved.