# Hand.Generators **Repository Path**: donetsoftwork/hand.-generators ## Basic Information - **Project Name**: Hand.Generators - **Description**: .NET代码生成器 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-03-09 - **Last Updated**: 2026-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SourceGenerator填坑 >* 节约重复代码编写 >* 使得代码更简洁易读 >* 代替反射提高性能,AOT友好 ## 一、代码的三种形态 ### 1. SourceText >* 源码文本 ### 2. SyntaxTree >* 语法树 ### 3. ISymbol >* 符号,相当于反射成员信息 ## 二、SyntaxTree可以转化为SourceText ~~~csharp var userType = SyntaxFactory.ClassDeclaration("User") .AddMembers( SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("string"), "Name") .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)) .AddAccessorListAccessors( SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)), SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration) .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)) )); string sourceText = userType.ToFullString(); ~~~ ## 三、SourceText可以转化为SyntaxTree ~~~csharp string sourceText = @" class User { public string Name { get; set; } }"; SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(sourceText); ~~~ ## 四、SourceText可以转化为ISymbol >* 可以通过编译转化为ISymbol >* 但是ISymbol是不能转化为源码 >* ISymbol用于反射类型信息 ~~~csharp string sourceText = @" class User { public string Name { get; set; } }"; SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(sourceText); var compilation = CSharpCompilation.Create("Tests", [syntaxTree]); INamedTypeSymbol? userSymbol = compilation.GetTypeByMetadataName("User"); ~~~ ## 五、SourceGenerator默认把源码转化为SyntaxTree和ISymbol ### 给代码增加注释 ### 1. 普通注释 ~~~csharp var userType = SyntaxFactory.ClassDeclaration("User") .WithLeadingTrivia(SyntaxFactory.TriviaList( SyntaxFactory.Comment("// ") ) ); ~~~ ### 1.1 效果如下 ~~~csharp // class User { } ~~~