var ns = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.IdentifierName("Models"));
var fns = SyntaxFactory.FileScopedNamespaceDeclaration(SyntaxFactory.IdentifierName("Services"));
1.2 简化方式
csharp复制代码
var ns = SyntaxGenerator.NamespaceDeclaration("Models");
var fns = SyntaxGenerator.FileScopedNamespaceDeclaration("Services");
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 简化方式
csharp复制代码
var x = SyntaxGenerator.IntType.Variable("x");
var y = SyntaxGenerator.IntType.Variable("y", SyntaxGenerator.Literal(1));
var z = SyntaxGenerator.IntType.Variable("z", SyntaxGenerator.Literal(1));
5.3 生成的代码
csharp复制代码
int x;
int y = 1;
var z = 1;
6. 定义参数
6.1 默认方式
csharp复制代码
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 简化方式
csharp复制代码
var a = SyntaxGenerator.IntType.Parameter("a");
var b = SyntaxGenerator.IntType.Parameter("b", SyntaxGenerator.Literal(1));
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 生成的代码
csharp复制代码
int Increment(int num, int value = 1)
{
return num + value;
}
8. 定义字段
8.1 默认方式
csharp复制代码
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 简化方式
csharp复制代码
var _x = SyntaxGenerator.IntType.Field("_x");
var _y = SyntaxGenerator.IntType.Field("_y", SyntaxGenerator.Literal(1));
8.3 生成的代码
csharp复制代码
int _x;
int _y = 1;
9. 定义属性
9.1 默认方式
csharp复制代码
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 简化方式
csharp复制代码
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 property = SyntaxGenerator.IntType.Property(SyntaxFactory.Identifier("Age"), getAge, setAge);
9.3 生成的代码
csharp复制代码
int Id { get; set; }
string Name
{
get
{
return _name;
}
}
int Age
{
get
{
return _age;
}
set
{
_age = value;
}
}
10. 声明类和结构体
10.1 默认方式
csharp复制代码
var userClass = SyntaxFactory.ClassDeclaration("UserClass");
var userStruct = SyntaxFactory.StructDeclaration("UserStruct");
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. 生成的代码
csharp复制代码
UserId(int original)
{
_original = original;
}
12. 声明记录类
12.1 默认方式
csharp复制代码
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 简化方式
csharp复制代码
var record = SyntaxGenerator.RecordDeclaration("Person")
.AddParameterListParameters(
SyntaxGenerator.StringType.Parameter("Name")
)
.WithSemicolonToken();
var type = SyntaxGenerator.RecordStructDeclaration("UserId")
.AddParameterListParameters(
SyntaxGenerator.IntType.Parameter("Id")
)
.WithSemicolonToken();
13.3 生成的代码
csharp复制代码
record struct UserId(int Id);
14. 访问修饰符
14.1 访问修饰符种类
private
protected
internal
public
14.2 默认方式
csharp复制代码
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 简化方式
csharp复制代码
var field = SyntaxGenerator.IntType.Field("_id")
.Private();
var property = SyntaxGenerator.IntType.Property("Id",
SyntaxKind.GetAccessorDeclaration,
SyntaxKind.InitAccessorDeclaration)
.Public();
14.4 生成的代码
csharp复制代码
private int _id;
public int Id { get; init; }
15. 字段修饰符
13.1 字段修饰符种类
readonly
const
volatile
15.2 默认方式
csharp复制代码
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 简化方式
csharp复制代码
var field = SyntaxGenerator.IntType.Field("_id")
.Private()
.ReadOnly();
15.4 生成的代码
csharp复制代码
private readonly int _id;
16. 参数修饰符
16.1 参数修饰符种类
params
in
ref
out
16.2 默认方式
csharp复制代码
var parameter = SyntaxFactory.Parameter(SyntaxFactory.Identifier("name"))
.WithType(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)))
.AddModifiers(SyntaxFactory.Token(SyntaxKind.RefKeyword));
16.3 简化方式
csharp复制代码
var parameter = SyntaxGenerator.StringType.Parameter("name")
.Ref();
var method = SyntaxGenerator.IntType.Method("CreateId")
.Virtual()
.ToBuilder()
.Return(SyntaxFactory.IdentifierName("_seed").PostIncrement());
17.4 生成的代码
csharp复制代码
virtual int CreateId()
{
return _seed++;
}
18. 其他修饰符
18.1 其他修饰符种类
abstract
sealed
new
static
partial
18.2 默认方式
csharp复制代码
var method = SyntaxFactory.MethodDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)), "CreateId")
.AddModifiers(SyntaxFactory.Token(SyntaxKind.PartialKeyword))
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));
18.3 简化方式
csharp复制代码
var method = SyntaxGenerator.IntType.Method("CreateId")
.Partial()
.WithSemicolonToken();
18.4 生成的代码
csharp复制代码
partial int CreateId();
四、方法体定义
1. 方法体构造器
调用ToBuilder简化方法体定义
1.1 支持构造函数、方法和属性
csharp复制代码
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 生成的代码
csharp复制代码
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 默认方式
csharp复制代码
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 简化方式
csharp复制代码
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 生成的代码
csharp复制代码
string BoolToString(bool? value)
{
if (value == null)
return "false";
else if (value)
return "true";
return "false";
}
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 生成的代码
csharp复制代码
bool IntToBool(int value)
{
switch (value)
{
case 0:
return false;
case 1:
return true;
default:
return true;
}
}
4. foreach循环
4.1 默认方式
csharp复制代码
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)
);
4.2 简化方式
csharp复制代码
var list = SyntaxFactory.IdentifierName("list");
var item = SyntaxFactory.IdentifierName("item");
var count = SyntaxFactory.IdentifierName("count");
var method = SyntaxGenerator.IntType.Method("Count", SyntaxGenerator.IntType.Array().Parameter(list.Identifier))
.ToBuilder()
.Declare(SyntaxGenerator.VarType.Variable(count.Identifier, SyntaxGenerator.Literal(0)))
.ForEach(SyntaxGenerator.VarType, item.Identifier, list)
.Add(count.AddAssign(item))
.End()
.Return(count);
4.3 生成的代码
csharp复制代码
int Count(int[] list)
{
var count = 0;
foreach (var item in list)
count += item;
return count;
}
5. for循环
5.1 默认方式
csharp复制代码
var i = SyntaxFactory.IdentifierName("i");
var num = SyntaxFactory.IdentifierName("num");
var count = SyntaxFactory.IdentifierName("count");
var method = SyntaxFactory.MethodDeclaration(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), "Total")
.AddParameterListParameters(
SyntaxFactory.Parameter(num.Identifier)
.WithType(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.ForStatement(
SyntaxFactory.VariableDeclaration(
SyntaxFactory.IdentifierName("var")).AddVariables(
SyntaxFactory.VariableDeclarator(i.Identifier)
.WithInitializer(SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression,
SyntaxFactory.Literal(0)))),
default,
SyntaxFactory.BinaryExpression(SyntaxKind.LessThanExpression, i, num),
SyntaxFactory.SingletonSeparatedList<ExpressionSyntax>(SyntaxFactory.PostfixUnaryExpression(SyntaxKind.PostIncrementExpression, i)),
SyntaxFactory.ExpressionStatement(SyntaxFactory.AssignmentExpression(SyntaxKind.AddAssignmentExpression, count, i))),
SyntaxFactory.ReturnStatement(count)
);
5.2 简化方式
csharp复制代码
var i = SyntaxFactory.IdentifierName("i");
var num = SyntaxFactory.IdentifierName("num");
var count = SyntaxFactory.IdentifierName("count");
var method = SyntaxGenerator.IntType.Method("Total", SyntaxGenerator.IntType.Parameter(num.Identifier))
.ToBuilder()
.Declare(SyntaxGenerator.IntType.Variable(count.Identifier, SyntaxGenerator.Literal(0)))
.For(i, num)
.Add(count.AddAssign(i))
.End()
.Return(count);
5.3 生成的代码
csharp复制代码
int Total(int num)
{
int count = 0;
for (var i = 0; i < num; i++)
count += i;
return count;
}
6. while循环
6.1 默认方式
csharp复制代码
var readerType = SyntaxFactory.IdentifierName("DbDataReader");
var reader = SyntaxFactory.IdentifierName("reader");
var listType = SyntaxFactory.GenericName("List")
.AddTypeArgumentListArguments(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)));
var list = SyntaxFactory.IdentifierName("list");
var getFieldValue = SyntaxFactory.QualifiedName(
reader,
SyntaxFactory.GenericName("GetFieldValue")
.AddTypeArgumentListArguments(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword))));
var method = SyntaxFactory.MethodDeclaration(listType, "GetIds")
.AddParameterListParameters(
SyntaxFactory.Parameter(reader.Identifier)
.WithType(readerType)
)
.AddBodyStatements(
SyntaxFactory.LocalDeclarationStatement(SyntaxFactory.VariableDeclaration(
listType, SyntaxFactory.SingletonSeparatedList(
SyntaxFactory.VariableDeclarator(list.Identifier)
.WithInitializer(SyntaxFactory.CollectionExpression())))),
SyntaxFactory.WhileStatement(
SyntaxFactory.InvocationExpression(SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, reader, SyntaxFactory.IdentifierName("Read"))),
SyntaxFactory.ExpressionStatement(
SyntaxFactory.InvocationExpression(SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, list, SyntaxFactory.IdentifierName("Add")))
.AddArgumentListArguments(SyntaxFactory.Argument(
SyntaxFactory.InvocationExpression(getFieldValue)
.AddArgumentListArguments(SyntaxFactory.Argument(
SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(0))
))
))
)
),
SyntaxFactory.ReturnStatement(list)
);
6.2 简化方式
csharp复制代码
var readerType = SyntaxFactory.IdentifierName("DbDataReader");
var reader = SyntaxFactory.IdentifierName("reader");
var listType = SyntaxGenerator.Generic("List", SyntaxGenerator.IntType);
var list = SyntaxFactory.IdentifierName("list");
var getFieldValue = SyntaxGenerator.Generic("GetFieldValue", SyntaxGenerator.IntType).Qualified(reader);
var method = listType.Method("GetIds", readerType.Parameter(reader.Identifier))
.ToBuilder()
.Declare(listType.Variable(list.Identifier, SyntaxFactory.CollectionExpression()))
.While(reader.Access("Read").Invocation())
.Add(list.Access("Add").Invocation([getFieldValue.Invocation([SyntaxGenerator.Literal(0)])]))
.End()
.Return(list);
6.3 生成的代码
csharp复制代码
List<int> GetIds(DbDataReader reader)
{
List<int> list = [];
while (reader.Read())
list.Add(reader.GetFieldValue<int>(0));
return list;
}
var console = SyntaxFactory.IdentifierName("Console");
var writeLine = console.Access("WriteLine");
var thing = SyntaxFactory.IdentifierName("thing");
var method = SyntaxGenerator.VoidType.Method("DoSTh")
.ToBuilder()
.Declare(SyntaxGenerator.StringType.Nullable().Variable(thing.Identifier))
.Add(writeLine.Invocation([SyntaxGenerator.Literal("Enter some things:")]))
.Do(thing.NotEqual(SyntaxGenerator.Literal("exit")))
.Add(thing.Assign(console.Access("ReadLine").Invocation()))
.Add(console.Access("Write").Invocation([SyntaxGenerator.Literal("Do ")]))
.Add(writeLine.Invocation([thing]))
.End()
.End();
6.3 生成的代码
csharp复制代码
void DoSTh()
{
string? thing;
Console.WriteLine("Enter some things:");
do
{
thing = Console.ReadLine();
Console.Write("Do ");
Console.WriteLine(thing);
}
while (thing != "exit");
}
五、生成类完整的Case
SyntaxGenerator.Create用于组装类的成员
1. 简化方式
csharp复制代码
var type = SyntaxFactory.ClassDeclaration("UserId")
.Public()
.Partial();
var original = SyntaxFactory.IdentifierName("original");
var _original = SyntaxFactory.IdentifierName("_original");
var field = SyntaxGenerator.IntType.Field(_original.Identifier)
.Private()
.ReadOnly();
var property = SyntaxGenerator.IntType.GetOnlyProperty("Original", _original)
.Public();
var constructor = type.Constructor(SyntaxGenerator.IntType.Parameter(original.Identifier))
.Public()
.ToBuilder()
.Add(field.ToIdentifierName().Assign(original))
.End();
var builder = SyntaxGenerator.Create("Models", type, constructor, field, property);
var result = builder.Build();
2 生成的代码
csharp复制代码
// <auto-generated/>
namespace Models
{
public partial class UserId
{
public UserId(int original)
{
_original = original;
}
private readonly int _original;
public int Original
{
get
{
return _original;
}
}
}
}