当前位置: 首页 > article >正文

.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 字段修饰符种类readonlyconstvolatile‌15.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 方法修饰符种类virtual‌overrideextern‌async17.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 其他修饰符种类abstractsealednewstatic‌partial18.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) );

相关文章:

.NET源码生成器使用SyntaxTree生成代码及简化语法

一、SyntaxTree是什么SyntaxTree是语法树,是源代码的树形结构表示由Roslyn编译器生成在SourceGenerator中会自动生成整个源代码结构是1个SyntaxTreeSyntaxTree有一个根节点(SyntaxNode)每个SyntaxNode也包含一个SyntaxTree这样看整个源代码结构就是片“森林”public abstract p…...

Pixel Epic智识终端入门:动态卷轴输出中断恢复与断点续写功能

Pixel Epic智识终端入门:动态卷轴输出中断恢复与断点续写功能 1. 认识Pixel Epic智识终端 Pixel Epic智识终端是一款基于AgentCPM-Report大模型构建的研究报告辅助工具。与传统AI工具不同,它将枯燥的科研过程转化为一场像素风格的RPG冒险。在这个虚拟世…...

揭秘Windows热键失踪案:Hotkey Detective侦探手册

揭秘Windows热键失踪案:Hotkey Detective侦探手册 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾在Windows系统中按下熟悉的…...

Wan2.2-I2V-A14B部署教程:解决OOM/驱动报错/端口冲突三大常见问题

Wan2.2-I2V-A14B部署教程:解决OOM/驱动报错/端口冲突三大常见问题 1. 镜像概述与核心优势 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像,特别针对RTX 4090D 24GB显存配置进行了深度优化。这个镜像最大的特点是解决了AI视频生成领域常见的…...

炉石传说自动化脚本终极指南:从3小时到3分钟的游戏体验革命

炉石传说自动化脚本终极指南:从3小时到3分钟的游戏体验革命 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Heart…...

京东开放平台应用申请实战:从零到一,避开那些“看不见”的坑

1. 为什么你需要这份京东开放平台避坑指南? 第一次申请京东开放平台应用时,我踩遍了所有能踩的坑。记得当时为了赶项目进度,直接跳过了官方文档的"不重要章节",结果在云鼎环境配置环节卡了整整三天。后来才发现&#xf…...

Lingbot-Depth-Pretrain-ViTL-14 Anaconda环境搭建:创建隔离的Python开发与推理环境

Lingbot-Depth-Pretrain-ViTL-14 Anaconda环境搭建:创建隔离的Python开发与推理环境 你是不是也遇到过这种情况:好不容易跟着教程跑通了一个AI项目,结果过两天想跑另一个项目时,发现各种库版本冲突,报错满天飞&#x…...

Thorium浏览器:重新定义Chromium性能与隐私体验的开源解决方案

Thorium浏览器:重新定义Chromium性能与隐私体验的开源解决方案 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Windows and MacOS/Raspi/Android/Special builds are in different repositories, links are towards the top of t…...

Phi-3-mini-4k-instruct-gguf实操手册:短问答/改写/摘要三大高频场景落地

Phi-3-mini-4k-instruct-gguf实操手册:短问答/改写/摘要三大高频场景落地 1. 模型简介与核心能力 Phi-3-mini-4k-instruct-gguf是微软推出的轻量级文本生成模型,基于Phi-3系列优化而来。这个GGUF版本特别适合处理短文本任务,具有以下特点&a…...

造相Z-Image文生图模型v2实战应用:电商主图、课件插图、设计提案一键生成

造相Z-Image文生图模型v2实战应用:电商主图、课件插图、设计提案一键生成 1. 为什么选择Z-Image v2进行商业图像创作 在当今内容爆炸的时代,视觉素材的需求量呈指数级增长。传统图像创作方式面临三大痛点:专业设计师成本高昂、版权素材获取…...

EasyAnimateV5-7b-zh-InP一键部署教程:基于Linux系统的快速安装指南

EasyAnimateV5-7b-zh-InP一键部署教程:基于Linux系统的快速安装指南 1. 引言 想快速在Linux系统上部署一个强大的视频生成模型吗?EasyAnimateV5-7b-zh-InP是一个22GB的图生视频模型,支持多分辨率视频生成,还能用中英文双语进行预…...

USB251xB集线器I²C控制库:嵌入式USB设备扩展实战指南

1. 项目概述SparkFun USB Hub Qwiic USB251x 是一款面向嵌入式原型开发与量产过渡阶段的轻量级 USB 2.0 集线器控制库,专为 SparkFun 自研的 Qwiic 兼容 USB251xB 系列 Hub 模块(SPX-18014)设计。该库并非通用 USB 协议栈,而是聚焦…...

Qwen-Image-Edit-F2P开源可部署优势:模型权重完全本地化,无外部API依赖风险

Qwen-Image-Edit-F2P开源可部署优势:模型权重完全本地化,无外部API依赖风险 1. 开箱即用的AI图像编辑体验 想象一下,你只需要一台配备24GB显存的电脑,就能拥有一个专业的AI图像编辑工作室。Qwen-Image-Edit-F2P正是这样一个让人…...

如何通过手机号快速查询QQ号:3分钟解决账号遗忘难题

如何通过手机号快速查询QQ号:3分钟解决账号遗忘难题 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 在数字时代,QQ账号作为重要的社交和工作工具,其安全性与可访问性至关重要。然而,更…...

抖音无水印下载完全指南:5分钟掌握批量下载核心技巧

抖音无水印下载完全指南:5分钟掌握批量下载核心技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

ARMv8汇编指令实战解析:adrp、adr与adr_l在Linux内核启动中的应用

1. ARMv8寻址指令家族概览 在ARMv8架构中,adrp、adr和adr_l这三个指令堪称地址计算的"三剑客"。它们虽然名字相似,但各自有着独特的设计哲学和应用场景。就像搬家时选择不同的交通工具——adr是短途搬运的小推车,adrp是能承载重物的…...

从HTTP到gRPC:etcd v2与v3 API调用差异及Postman实战解析

1. etcd v2与v3 API的核心差异解析 第一次接触etcd时,你可能和我一样被网上的v2教程坑过——照着文档发送HTTP请求却总是返回404错误。这其实是因为etcd v3默认关闭了v2 API支持,而大多数中文教程还在用陈旧的v2示例。让我们先理清这两个版本的本质区别&…...

需要控制重复点击按钮的通用方法

如图所示 在需要控制重复点击的地方使用通用方法去控制 省时省力 比用传统的分页定时器更方便...

Emacs verilog-mode实战:5分钟搞定AUTOARG自动参数生成(附避坑指南)

Emacs verilog-mode实战:5分钟掌握AUTOARG高效参数生成技巧 在数字电路设计领域,Verilog作为主流硬件描述语言,其模块化开发方式虽然提高了代码复用性,却也带来了大量重复性工作。模块接口定义中的参数列表维护就是典型痛点——每…...

HUNYUAN-MT 7B翻译终端Python爬虫数据清洗实战:多语言文本归一化处理

HUNYUAN-MT 7B翻译终端Python爬虫数据清洗实战:多语言文本归一化处理 1. 引言 你有没有遇到过这种情况?辛辛苦苦用Python爬虫从全球各地的网站、论坛、社交媒体上抓取了一大堆数据,准备做分析或者训练模型,结果打开一看&#xf…...

56:L构建蓝队AI:蓝队的智能防御

作者: HOS(安全风信子) 日期: 2026-03-07 主要来源平台: GitHub 摘要: 面对基拉等高级威胁的不断进化,传统的蓝队防御手段已经难以应对。L构建了一套蓝队AI系统,通过AI驱动的威胁检测、自动响应和防御优化&…...

CefFlashBrowser:终极Flash浏览器解决方案,轻松玩转经典Flash游戏与课件

CefFlashBrowser:终极Flash浏览器解决方案,轻松玩转经典Flash游戏与课件 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否还在为无法打开珍藏的Flash游戏而烦…...

Display Driver Uninstaller(DDU):显卡驱动深度清理工具,解决游戏玩家与设计师的驱动残留难题

Display Driver Uninstaller(DDU):显卡驱动深度清理工具,解决游戏玩家与设计师的驱动残留难题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项…...

Ubuntu系统磁盘管理

要在Ubuntu系统中开机自动挂载AWS EBS卷(设备名为/dev/xvdd),需通过**/etc/fstab文件**配置自动挂载规则。以下是完整步骤(含前提条件、命令和验证): 一、前提条件 确认磁盘状态:/dev/xvdd需已…...

stealth.js全解析:40+反检测补丁的配置与优化技巧

Stealth.js全解析:40反检测补丁的配置与优化技巧 在当今的Web自动化领域,反检测技术已成为开发者必须掌握的核心技能之一。无论是数据采集、自动化测试还是其他需要模拟真实用户行为的场景,如何让脚本"隐形"都是决定成败的关键因素…...

解锁微信多设备协同新体验:WeChatPad技术全解析

解锁微信多设备协同新体验:WeChatPad技术全解析 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad WeChatPad通过创新的设备伪装技术,突破微信单设备登录限制,实现手机与平板的…...

Pixel Couplet Gen部署案例:混合云架构(公有云API+私有云模型)方案

Pixel Couplet Gen部署案例:混合云架构(公有云API私有云模型)方案 1. 项目背景与价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。该项目基于ModelScope大模型驱动,通过创新的8-bit像素游戏UI设…...

XHS-Downloader:构建高效采集流程的无水印内容批量管理方案

XHS-Downloader:构建高效采集流程的无水印内容批量管理方案 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接…...

SDMatte多风格抠图作品集:从商品白底图到艺术创意合成

SDMatte多风格抠图作品集:从商品白底图到艺术创意合成 1. 开篇:当抠图遇上AI 还记得那些年用Photoshop一点一点抠图的痛苦经历吗?边缘总是处理不干净,头发丝永远抠不完整,遇到复杂背景更是让人抓狂。现在&#xff0c…...

Elsevier Tracker:告别投稿焦虑,3分钟实现学术稿件智能追踪

Elsevier Tracker:告别投稿焦虑,3分钟实现学术稿件智能追踪 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在为Elsevier投稿后的漫长等待而焦虑吗?每天反复登录系统查看审稿状…...