提问人:ASi 提问时间:9/13/2023 最后编辑:ASi 更新时间:9/15/2023 访问量:64
使用 Roslyn 生成“只读记录结构”
Generate a 'readonly record struct' using Roslyn
问:
我无法使用 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:”readonly“修饰符对此元素无效。
答:
3赞
Youssef13
9/15/2023
#1
问题在于,您正在创建的记录声明具有 .即使添加 struct 关键字,它也不会更改最初创建的 SyntaxKind。要解决此问题,您需要按如下方式执行:SyntaxKind.RecordDeclaration
SyntaxKind.RecordStructDeclaration
SyntaxFactory.RecordDeclaration(
SyntaxKind.RecordStructDeclaration,
SyntaxFactory.Token(SyntaxKind.RecordKeyword),
SyntaxFactory.Identifier("A"))
而不是
SyntaxFactory.RecordDeclaration(
SyntaxFactory.Token(SyntaxKind.RecordKeyword),
SyntaxFactory.Identifier("A"))
评论
CSharpSyntaxTree.ParseText("public readonly record struct A();")