我无法使用 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:“只读”修饰符对此元素无效。”
问题是您正在创建的记录声明具有
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"))