我有以下代码来生成属性:
类型:
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);
但是,当结构类型的名称是参数时,我总是得到一个例外(例如 DateTime 或 Guid - 对于Guid,我甚至找不到适当的特殊类型):
不支持的SpecialType
at: Microsoft.CodeAnalysis.CSharp.CodeGeneration.CSharpSyntaxGenerator.TypeExpression(SpecialType specialType)
at: MyProject.CreateProperty(String name, String type)
我应该使用什么?
答案 0 :(得分:3)
您可以根据类型名称创建属性,因此可以使用
等代码创建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方法?)