.NET源码生成器使用SyntaxTree生成代码及简化语法
一、SyntaxTree是什么SyntaxTree是语法树,是源代码的树形结构表示由Roslyn编译器生成在SourceGenerator中会自动生成整个源代码结构是1个SyntaxTreeSyntaxTree有一个根节点(SyntaxNode)每个SyntaxNode也包含一个SyntaxTree这样看整个源代码结构就是片“森林”public abstract partial class SyntaxNode { // ... public SyntaxTree SyntaxTree this.SyntaxTreeCore; } public abstract class SyntaxTree { // ... public SyntaxNode GetRoot(CancellationToken cancellationToken default) { return GetRootCore(cancellationToken); } }二、SyntaxTree的作用1. 分析源代码用于分析本次增量代码是否满足生成器规则找出指定的类、方法及特性(Attribute)2. 直接用来生成代码源代码字符串可以转化为SyntaxTreeSyntaxTree也可以转化为源代码也可以部分用字符串转化为SyntaxTree组合使用3. SyntaxTree生成代码有优势直接生成语法树保证语法的正确性和准确性原生csharp代码,更方便开发和调试SyntaxTree不会生成过多的字符串碎片4. SyntaxTree生成代码的方法一般使用SyntaxFactory类来生成代码笔者对部分功能进行简化,使得生成代码更简单dotnet add package Hand.Generators.EasySyntax --version 0.1.0.1-alpha希望通过本篇文章引导大家把拼接字符串生成代码的方式替换为使用SyntaxTree三、SyntaxTree基本元素1. 声明命名空间1.1 原始方式var ns SyntaxFactory.NamespaceDeclaration(SyntaxFactory.IdentifierName(Models)); var fns SyntaxFactory.FileScopedNamespaceDeclaration(SyntaxFactory.IdentifierName(Services));1.2 简化方式var ns SyntaxGenerator.NamespaceDeclaration(Models); var fns SyntaxGenerator.FileScopedNamespaceDeclaration(Services);1.3 生成的代码namespace Models { } namespace Services;2. 预定义类型2.1 原始方式SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.BoolKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.ByteKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.SByteKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.UIntKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.ShortKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.UShortKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.LongKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.ULongKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.FloatKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.DoubleKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.DecimalKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.CharKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.ObjectKeyword))SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword))2.2 简化方式SyntaxGenerator.BoolTypeSyntaxGenerator.ByteTypeSyntaxGenerator.SByteTypeSyntaxGenerator.IntTypeSyntaxGenerator.UIntTypeSyntaxGenerator.ShortTypeSyntaxGenerator.UShortTypeSyntaxGenerator.LongTypeSyntaxGenerator.ULongTypeSyntaxGenerator.FloatTypeSyntaxGenerator.DoubleTypeSyntaxGenerator.DecimalTypeSyntaxGenerator.StringTypeSyntaxGenerator.CharTypeSyntaxGenerator.ObjectTypeSyntaxGenerator.VoidType2.3 生成的代码boolbytesbyteintuintshortushortlongulongfloatdoubledecimalstringcharobjectvoid3. 常量表达式3.1 原始方式SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1))SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1U))SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1L))SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1UL))SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1F))SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1D))SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1M))SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(abc))SyntaxFactory.LiteralExpression(SyntaxKind.CharacterLiteralExpression, SyntaxFactory.Literal(a))SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression)SyntaxFactory.LiteralExpression(SyntaxKind.FalseLiteralExpression)SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)SyntaxFactory.LiteralExpression(SyntaxKind.DefaultLiteralExpression)SyntaxFactory.ObjectCreationExpression(SyntaxFactory.IdentifierName(Object))SyntaxFactory.ImplicitObjectCreationExpression()SyntaxFactory.CollectionExpression()3.2 简化方式SyntaxGenerator.Literal(1)SyntaxGenerator.Literal(1U)SyntaxGenerator.Literal(1L)SyntaxGenerator.Literal(1UL)SyntaxGenerator.Literal(1F)SyntaxGenerator.Literal(1D)SyntaxGenerator.Literal(1M)SyntaxGenerator.Literal(abc)SyntaxGenerator.Literal(a)SyntaxGenerator.TrueLiteralSyntaxGenerator.FalseLiteralSyntaxGenerator.NullLiteralSyntaxGenerator.DefaultLiteralSyntaxFactory.IdentifierName(Object).New()3.3 生成的代码11U1L1UL1F1Dushort1Mabcatruenulldefaultnew Object()new()[]4. 运算4.1 原始方式SyntaxFactory.BinaryExpression(SyntaxKind.AddExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.SubtractExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.MultiplyExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.DivideExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.ModuloExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.LeftShiftExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.RightShiftExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.BitwiseAndExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.BitwiseOrExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.ExclusiveOrExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.LogicalAndExpression, left, right)SyntaxFactory.BinaryExpression(SyntaxKind.LogicalOrExpression, left, right)SyntaxFactory.PrefixUnaryExpression(SyntaxKind.PreIncrementExpression, variable)SyntaxFactory.PrefixUnaryExpression(SyntaxKind.PreDecrementExpression, variable)SyntaxFactory.PostfixUnaryExpression(SyntaxKind.PostIncrementExpression, variable)SyntaxFactory.PostfixUnaryExpression(SyntaxKind.PostDecrementExpression, variable)SyntaxFactory.PrefixUnaryExpression(SyntaxKind.BitwiseNotExpression, variable)SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, variable)SyntaxFactory.QualifiedName(prefix, name)SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, owner, member)SyntaxFactory.ConditionalAccessExpression(owner, SyntaxFactory.MemberBindingExpression(SyntaxFactory.IdentifierName(member)))4.2 简化方式(扩展方法)left.Add(right)left.Subtract(right)left.Multiply(right)left.Divide(right)left.Modulo(right)left.LeftShift(right)left.RightShift(right)left.And(right)left.Or(right)left.XOr(right)left.LogicalAnd(right)left.LogicalOr(right)variable.PreIncrement()variable.PreDecrement()variable.PostIncrement()variable.PostDecrement()variable.Not()variable.LogicalNot()name.Qualified(prefix)owner.Access(member)owner.ConditionalAccess(member)4.3 生成的代码left rightleft - rightleft * rightleft / rightleft % rightleft rightleft rightleft rightleft | rightleft ^ rightleft rightleft || rightvariable--variablevariablevariable--~variable!variableprefix.nameowner.memberowner?.member5. 定义变量5.1 原始方式var x SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))) .AddVariables(SyntaxFactory.VariableDeclarator(x)); var y SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))) .AddVariables(SyntaxFactory.VariableDeclarator(y) .WithInitializer(SyntaxFactory.EqualsValueClause( SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1))))); var z SyntaxFactory.VariableDeclaration(SyntaxFactory.IdentifierName(SyntaxFactory.Token(SyntaxKind.VarKeyword))) .AddVariables(SyntaxFactory.VariableDeclarator(z) .WithInitializer(SyntaxFactory.EqualsValueClause( SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1)))));5.2 简化方式var x SyntaxGenerator.IntType.Variable(x); var y SyntaxGenerator.IntType.Variable(y, SyntaxGenerator.Literal(1)); var z SyntaxGenerator.VarType.Variable(z, SyntaxGenerator.Literal(1));5.3 生成的代码int x; int y 1; var z 1;6. 定义参数6.1 原始方式var a SyntaxFactory.Parameter(SyntaxFactory.Identifier(a)) .WithType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))); var b SyntaxFactory.Parameter(SyntaxFactory.Identifier(b)) .WithType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))) .WithDefault(SyntaxFactory.EqualsValueClause( SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1))));6.2 简化方式var a SyntaxGenerator.IntType.Parameter(a); var b SyntaxGenerator.IntType.Parameter(b, SyntaxGenerator.Literal(1));6.3 生成的代码int a int b 17.定义函数7.1 原始方式var method SyntaxFactory.MethodDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), Increment) .AddParameterListParameters( SyntaxFactory.Parameter(SyntaxFactory.Identifier(num)) .WithType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))), SyntaxFactory.Parameter(SyntaxFactory.Identifier(value)) .WithType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))) .WithDefault(SyntaxFactory.EqualsValueClause( SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1)))) ) .WithBody(SyntaxFactory.Block( SyntaxFactory.ReturnStatement( SyntaxFactory.BinaryExpression(SyntaxKind.AddExpression, SyntaxFactory.IdentifierName(num), SyntaxFactory.IdentifierName(value)) ) ));7.2 简化方式var num SyntaxFactory.IdentifierName(num); var value SyntaxFactory.IdentifierName(value); var method SyntaxGenerator.IntType.Method(Increment, SyntaxGenerator.IntType.Parameter(num.Identifier), SyntaxGenerator.IntType.Parameter(value.Identifier, SyntaxGenerator.Literal(1))) .ToBuilder() .Return(num.Add(value));7.3 生成的代码int Increment(int num, int value 1) { return num value; }8. 定义字段8.1 原始方式var _x SyntaxFactory.FieldDeclaration(SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)))) .AddDeclarationVariables( SyntaxFactory.VariableDeclarator(_x) ); var _y SyntaxFactory.FieldDeclaration(SyntaxFactory.VariableDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)))) .AddDeclarationVariables( SyntaxFactory.VariableDeclarator(_y) .WithInitializer(SyntaxFactory.EqualsValueClause( SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1))) ) );8.2 简化方式var _x SyntaxGenerator.IntType.Field(_x); var _y SyntaxGenerator.IntType.Field(_y, SyntaxGenerator.Literal(1));8.3 生成的代码int _x; int _y 1;9. 定义属性9.1 原始方式var Id SyntaxFactory.PropertyDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), SyntaxFactory.Identifier(Id)) .AddAccessorListAccessors( SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)), SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)) ); var Name SyntaxFactory.PropertyDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)), SyntaxFactory.Identifier(Name)) .AddAccessorListAccessors( SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration) .AddBodyStatements(SyntaxFactory.ReturnStatement(SyntaxFactory.IdentifierName(_name))) ); var Age SyntaxFactory.PropertyDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), SyntaxFactory.Identifier(Age)) .AddAccessorListAccessors( SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration) .AddBodyStatements(SyntaxFactory.ReturnStatement(SyntaxFactory.IdentifierName(_age))), SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration) .AddBodyStatements(SyntaxFactory.ExpressionStatement( SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, SyntaxFactory.IdentifierName(_age), SyntaxFactory.IdentifierName(value)))) );9.2 简化方式var Id SyntaxGenerator.IntType.Property(SyntaxFactory.Identifier(Id), SyntaxKind.GetAccessorDeclaration, SyntaxKind.SetAccessorDeclaration); var Name SyntaxGenerator.StringType.GetOnlyProperty(SyntaxFactory.Identifier(Name), SyntaxFactory.IdentifierName(_name)); var getAge SyntaxGenerator.PropertyGetDeclaration() .ToBuilder() .Return(SyntaxFactory.IdentifierName(_age)); var setAge SyntaxGenerator.PropertySetDeclaration() .ToBuilder() .Add(SyntaxFactory.IdentifierName(_age).AssignValue()) .End(); var Age SyntaxGenerator.IntType.Property(SyntaxFactory.Identifier(Age), getAge, setAge);9.3 生成的代码int Id { get; set; } string Name { get { return _name; } } int Age { get { return _age; } set { _age value; } }10. 声明类和结构体10.1 原始方式var userClass SyntaxFactory.ClassDeclaration(UserClass); var userStruct SyntaxFactory.StructDeclaration(UserStruct);10.2. 无简化方式10.3. 生成的代码class UserClass { } struct UserStruct { }11.定义构造函数11.1 原始方式var constructor SyntaxFactory.ConstructorDeclaration(UserId) .AddParameterListParameters( SyntaxFactory.Parameter(SyntaxFactory.Identifier(original)) .WithType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)))) .AddBodyStatements(SyntaxFactory.ExpressionStatement( SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, SyntaxFactory.IdentifierName(_original), SyntaxFactory.IdentifierName(original))));11.2 简化方式var type SyntaxFactory.ClassDeclaration(UserId); var original SyntaxFactory.IdentifierName(original); var constructor type.Constructor(SyntaxGenerator.IntType.Parameter(original.Identifier)) .ToBuilder() .Add(SyntaxFactory.IdentifierName(_original).Assign(original)) .End();11.3. 生成的代码UserId(int original) { _original original; }12. 声明记录类12.1 原始方式var record SyntaxFactory.RecordDeclaration(SyntaxFactory.Token(SyntaxKind.RecordKeyword), Person) .AddParameterListParameters( SyntaxFactory.Parameter(SyntaxFactory.Identifier(Name)) .WithType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword))) ) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));12.2 简化方式var record SyntaxGenerator.RecordDeclaration(Person) .AddParameterListParameters( SyntaxGenerator.StringType.Parameter(Name) ) .WithSemicolonToken();12.3 生成的代码record Person(string Name);13. 声明记录结构体13.1 原始方式var recordDeclaration SyntaxFactory.RecordDeclaration(SyntaxKind.RecordStructDeclaration, SyntaxFactory.Token(SyntaxKind.RecordKeyword), SyntaxFactory.Identifier(UserId)) .WithClassOrStructKeyword(SyntaxFactory.Token(SyntaxKind.StructKeyword)) .AddParameterListParameters( SyntaxFactory.Parameter(SyntaxFactory.Identifier(Id)) .WithType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))) ) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));13.2 简化方式var type SyntaxGenerator.RecordStructDeclaration(UserId) .AddParameterListParameters( SyntaxGenerator.IntType.Parameter(Id) ) .WithSemicolonToken();13.3 生成的代码record struct UserId(int Id);14. 访问修饰符14.1 访问修饰符种类privateprotectedinternalpublic14.2 原始方式var field SyntaxFactory.FieldDeclaration( SyntaxFactory.VariableDeclaration( SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), SyntaxFactory.SingletonSeparatedList( SyntaxFactory.VariableDeclarator(SyntaxFactory.Identifier(_id)) ) )) .AddModifiers(SyntaxFactory.Token(SyntaxKind.PrivateKeyword)); var property SyntaxFactory.PropertyDeclaration( SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), SyntaxFactory.Identifier(Id)) .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)) .AddAccessorListAccessors( SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)), SyntaxFactory.AccessorDeclaration(SyntaxKind.InitAccessorDeclaration) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)) );14.3 简化方式var field SyntaxGenerator.IntType.Field(_id) .Private(); var property SyntaxGenerator.IntType.Property(Id, SyntaxKind.GetAccessorDeclaration, SyntaxKind.InitAccessorDeclaration) .Public();14.4 生成的代码private int _id; public int Id { get; init; }15. 字段修饰符13.1 字段修饰符种类readonlyconstvolatile15.2 原始方式var field SyntaxFactory.FieldDeclaration( SyntaxFactory.VariableDeclaration( SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), SyntaxFactory.SingletonSeparatedList( SyntaxFactory.VariableDeclarator(SyntaxFactory.Identifier(_id)) ) )) .AddModifiers( SyntaxFactory.Token(SyntaxKind.PrivateKeyword), SyntaxFactory.Token(SyntaxKind.ReadOnlyKeyword));15.3 简化方式var field SyntaxGenerator.IntType.Field(_id) .Private() .ReadOnly();15.4 生成的代码private readonly int _id;16. 参数修饰符16.1 参数修饰符种类paramsinrefout16.2 原始方式var parameter SyntaxFactory.Parameter(SyntaxFactory.Identifier(name)) .WithType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword))) .AddModifiers(SyntaxFactory.Token(SyntaxKind.RefKeyword));16.3 简化方式var parameter SyntaxGenerator.StringType.Parameter(name) .Ref();16.4 生成的代码ref string name17. 方法修饰符17.1 方法修饰符种类virtualoverrideexternasync17.2 原始方式var method SyntaxFactory.MethodDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)), CreateId) .AddModifiers(SyntaxFactory.Token(SyntaxKind.VirtualKeyword)) .WithBody( SyntaxFactory.Block(SyntaxFactory.ReturnStatement( SyntaxFactory.PostfixUnaryExpression(SyntaxKind.PostIncrementExpression, SyntaxFactory.IdentifierName(_seed)))) );17.3 简化方式var method SyntaxGenerator.IntType.Method(CreateId) .Virtual() .ToBuilder() .Return(SyntaxFactory.IdentifierName(_seed).PostIncrement());17.4 生成的代码virtual int CreateId() { return _seed; }18. 其他修饰符18.1 其他修饰符种类abstractsealednewstaticpartial18.2 原始方式var method SyntaxFactory.MethodDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)), CreateId) .AddModifiers(SyntaxFactory.Token(SyntaxKind.PartialKeyword)) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));18.3 简化方式var method SyntaxGenerator.IntType.Method(CreateId) .Partial() .WithSemicolonToken();18.4 生成的代码partial int CreateId();四、方法体定义1. 方法体构造器调用ToBuilder简化方法体定义1.1 支持构造函数、方法和属性var type SyntaxFactory.ClassDeclaration(UserId); var original SyntaxFactory.IdentifierName(original); var constructor type.Constructor(SyntaxGenerator.IntType.Parameter(original.Identifier)) .ToBuilder() .Add(SyntaxFactory.IdentifierName(_original).Assign(original)) .End(); var num SyntaxFactory.IdentifierName(num); var value SyntaxFactory.IdentifierName(value); var method SyntaxGenerator.IntType.Method(Increment, SyntaxGenerator.IntType.Parameter(num.Identifier), SyntaxGenerator.IntType.Parameter(value.Identifier, SyntaxGenerator.Literal(1))) .ToBuilder() .Return(num.Add(value)); var getAge SyntaxGenerator.PropertyGetDeclaration() .ToBuilder() .Return(SyntaxFactory.IdentifierName(_age)); var setAge SyntaxGenerator.PropertySetDeclaration() .ToBuilder() .Add(SyntaxFactory.IdentifierName(_age).AssignValue()) .End(); var property SyntaxGenerator.IntType.Property(SyntaxFactory.Identifier(Age), getAge, setAge);1.2 生成的代码UserId(int original) { _original original; } int Increment(int num, int value 1) { return num value; } int Age { get { return _age; } set { _age value; } }2. if/else分支逻辑2.1 原始方式var value SyntaxFactory.IdentifierName(value); var method SyntaxFactory.MethodDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)), BoolToString) .AddParameterListParameters( SyntaxFactory.Parameter(value.Identifier) .WithType(SyntaxFactory.NullableType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.BoolKeyword))))) .AddBodyStatements( SyntaxFactory.IfStatement( SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, value, SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)), SyntaxFactory.ReturnStatement(SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(false))), SyntaxFactory.ElseClause( SyntaxFactory.IfStatement( value, SyntaxFactory.ReturnStatement(SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(true))), SyntaxFactory.ElseClause(SyntaxFactory.ReturnStatement(SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal(false))))))) );2.2 简化方式var value SyntaxFactory.IdentifierName(value); var method SyntaxGenerator.StringType.Method(BoolToString, SyntaxGenerator.BoolType.Nullable().Parameter(value.Identifier)) .ToBuilder() .If(value.IsNull()) .Add(SyntaxGenerator.Literal(false).Return()) .ElseIf(value) .Return(SyntaxGenerator.Literal(true)) .Return(SyntaxGenerator.Literal(false));2.3 生成的代码string BoolToString(bool? value) { if (value null) return false; else if (value) return true; return false; }3. switch/case分支逻辑3.1 原始方式var value SyntaxFactory.IdentifierName(value); var method SyntaxFactory.MethodDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.BoolKeyword)), IntToBool) .AddParameterListParameters( SyntaxFactory.Parameter(value.Identifier) .WithType(SyntaxFactory.NullableType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))))) .AddBodyStatements( SyntaxFactory.SwitchStatement(value) .AddSections( SyntaxFactory.SwitchSection( SyntaxFactory.SingletonListSwitchLabelSyntax(SyntaxFactory.CaseSwitchLabel( SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(0)))), SyntaxFactory.SingletonListStatementSyntax(SyntaxFactory.ReturnStatement( SyntaxFactory.LiteralExpression(SyntaxKind.FalseLiteralExpression)))), SyntaxFactory.SwitchSection( SyntaxFactory.SingletonListSwitchLabelSyntax(SyntaxFactory.CaseSwitchLabel( SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1)))), SyntaxFactory.SingletonListStatementSyntax(SyntaxFactory.ReturnStatement( SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression)))), SyntaxFactory.SwitchSection( SyntaxFactory.SingletonListSwitchLabelSyntax(SyntaxFactory.DefaultSwitchLabel()), SyntaxFactory.SingletonListStatementSyntax(SyntaxFactory.ReturnStatement( SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression))))) );3.2 简化方式var value SyntaxFactory.IdentifierName(value); var method SyntaxGenerator.BoolType.Method(IntToBool, SyntaxGenerator.IntType.Parameter(value.Identifier)) .ToBuilder() .Switch(value) .Case(SyntaxGenerator.Literal(0)) .Add(SyntaxGenerator.FalseLiteral.Return()) .Case(SyntaxGenerator.Literal(1)) .Add(SyntaxGenerator.TrueLiteral.Return()) .Default() .Return(SyntaxGenerator.TrueLiteral) .End();3.3 生成的代码bool IntToBool(int value) { switch (value) { case 0: return false; case 1: return true; default: return true; } }4. foreach循环4.1 原始方式var list SyntaxFactory.IdentifierName(list); var item SyntaxFactory.IdentifierName(item); var count SyntaxFactory.IdentifierName(count); var method SyntaxFactory.MethodDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), Count) .AddParameterListParameters( SyntaxFactory.Parameter(list.Identifier) .WithType(SyntaxFactory.ArrayType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))))) .AddBodyStatements( SyntaxFactory.LocalDeclarationStatement(SyntaxFactory.VariableDeclaration( SyntaxFactory.IdentifierName(var), SyntaxFactory.SingletonSeparatedList( SyntaxFactory.VariableDeclarator(count.Identifier) .WithInitializer(SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(0)))))), SyntaxFactory.ForEachStatement( SyntaxFactory.IdentifierName(var), item.Identifier, list, SyntaxFactory.ExpressionStatement( SyntaxFactory.AssignmentExpression(SyntaxKind.AddAssignmentExpression, count, item))), SyntaxFactory.ReturnStatement(count) );
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2467876.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!