如何用Roslyn创建基于结构的属性

本文关键字:结构 属性 于结构 何用 Roslyn 创建 | 更新日期: 2023-09-27 17:54:49

我有下面的代码来生成一个属性:

类型:

types = new Dictionary<string, SpecialType>();
types.Add("Guid", SpecialType.System_Object);
types.Add("DateTime", SpecialType.System_DateTime);
types.Add("String", SpecialType.System_String);
types.Add("Int32", SpecialType.System_Int32);
types.Add("Boolean", SpecialType.System_Boolean);  
generator.PropertyDeclaration(name, generator.TypeExpression(types["DateTime"]), Accessibility.Public);

然而,当结构类型的名称是参数时,我总是得到一个异常(例如DateTimeGuid -对于Guid,我甚至找不到合适的特殊类型):

支持SpecialType

  at: Microsoft.CodeAnalysis.CSharp.CodeGeneration.CSharpSyntaxGenerator.TypeExpression(SpecialType specialType)
  at: MyProject.CreateProperty(String name, String type)

我应该用什么?

如何用Roslyn创建基于结构的属性

可以根据类型的名称创建属性,因此可以使用如下代码创建DateTime和Guid属性:

// Create an auto-property
var idProperty =
    SyntaxFactory.PropertyDeclaration(
        SyntaxFactory.ParseTypeName("Guid"),
        "Id"
    )
    .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
    .AddAccessorListAccessors(
        SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
        SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))
    );
// Create a read-only property, using a backing field
var createdAtProperty =
    SyntaxFactory.PropertyDeclaration(
        SyntaxFactory.ParseTypeName("DateTime"),
        "CreatedAt"
    )
    .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
    .AddAccessorListAccessors(
        SyntaxFactory.AccessorDeclaration(
            SyntaxKind.GetAccessorDeclaration,
            SyntaxFactory.Block(
                SyntaxFactory.List(new[] {
                    SyntaxFactory.ReturnStatement(SyntaxFactory.IdentifierName("_createdAt"))
                })
            )
        )
    );

如果我错过了一些明显的东西,这意味着你不能使用这种语法,你能编辑你的答案并包括一个可执行的最小复制案例吗?

(我注意到示例中的"PropertyDeclaration"方法指定的参数名称、类型和可访问性与SyntaxFactory类上的任何"PropertyDeclaration"方法签名都不对应——该方法是您编写的然后调用SyntaxFactory方法吗?)