Wjybxx.Commons.Poet
1.3.0
.NET 6.0
This package targets .NET 6.0. The package is compatible with this framework or higher.
.NET Standard 2.0
This package targets .NET Standard 2.0. The package is compatible with this framework or higher.
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package Wjybxx.Commons.Poet --version 1.3.0
NuGet\Install-Package Wjybxx.Commons.Poet -Version 1.3.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Wjybxx.Commons.Poet" Version="1.3.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Wjybxx.Commons.Poet" Version="1.3.0" />
<PackageReference Include="Wjybxx.Commons.Poet" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Wjybxx.Commons.Poet --version 1.3.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Wjybxx.Commons.Poet, 1.3.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Wjybxx.Commons.Poet@1.3.0
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Wjybxx.Commons.Poet&version=1.3.0
#tool nuget:?package=Wjybxx.Commons.Poet&version=1.3.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Csharp-Poet
Poet包是javapoet仓库的移植版。 我在java端使用javapoet生成各类辅助类已有5年左右,这是个非常好用的轮子的,但C#端没有合适的等价物,于是自己移植了一版。
用言语描述Poet包不够直观,我们直接看代码生成器和生成的代码(可运行测试用例)(代码生成器的最佳示例可见Dson和BTree库)。
GeneratorTest测试类(生成器)代码如下:
private static TypeSpec BuildClassType() {
TypeName dictionaryTypeName = TypeName.Get(typeof(LinkedDictionary<string, object>));
AttributeSpec processorAttribute = AttributeSpec.NewBuilder(ClassName.Get(typeof(GeneratedAttribute)))
.Constructor(CodeBlock.Of("$S", "GeneratorTest")) // 字符串$S
.Build();
AttributeSpec attributeSpec = AttributeSpec.NewBuilder(ClassName.Get(typeof(MyCodeAttribute)))
.AddMember("Name", CodeBlock.Of("$S", "wjybxx"))
.AddMember("Age", CodeBlock.Of("29"))
.Build();
TypeSpec classType = TypeSpec.NewClassBuilder("ClassBean")
.AddModifiers(Modifiers.Public)
.AddAttribute(processorAttribute)
.AddAttribute(attributeSpec)
// 字段
.AddField(TypeName.INT, "age", Modifiers.Private)
.AddField(TypeName.STRING, "name", Modifiers.Private)
.AddSpec(FieldSpec.NewBuilder(dictionaryTypeName, "blackboard", Modifiers.Public | Modifiers.Readonly)
.Initializer("new $T()", dictionaryTypeName)
.Build())
// 构造函数
.AddSpec(MethodSpec.NewConstructorBuilder()
.AddModifiers(Modifiers.Public)
.ConstructorInvoker(CodeBlock.Of("this($L, $S)", 29, "wjybxx"))
.Build())
.AddSpec(MethodSpec.NewConstructorBuilder()
.AddModifiers(Modifiers.Public)
.AddParameter(TypeName.INT, "age")
.AddParameter(TypeName.STRING, "name")
.Code(CodeBlock.NewBuilder()
.AddStatement("this.age = age")
.AddStatement("this.name = name")
.Build())
.Build())
// 属性
.AddSpec(PropertySpec.NewBuilder(TypeName.INT, "Age", Modifiers.Public)
.Getter(CodeBlock.Of("age").WithExpressionStyle(true))
.Setter(CodeBlock.Of("age = value").WithExpressionStyle(true))
.Build())
.AddSpec(PropertySpec.NewBuilder(TypeName.BOOL, "IsOnline", Modifiers.Private)
.Initializer("$L", false)
.Build()
)
// 普通方法
.AddSpec(MethodSpec.NewMethodBuilder("Sum")
.AddDocument("求int的和")
.AddModifiers(Modifiers.Public)
.Returns(TypeName.INT)
.AddParameter(TypeName.INT, "a")
.AddParameter(TypeName.INT, "b")
.Code(CodeBlock.NewBuilder()
.AddStatement("return a + b")
.Build())
.Build())
.AddSpec(MethodSpec.NewMethodBuilder("SumNullable")
.AddDocument("求空int的和")
.AddModifiers(Modifiers.Public | Modifiers.Extern)
.Returns(TypeName.INT.MakeNullableType())
.AddParameter(TypeName.INT.MakeNullableType(), "a")
.AddParameter(TypeName.INT, "b")
.Build())
.AddSpec(MethodSpec.NewMethodBuilder("SumRef")
.AddDocument("求ref int的和")
.AddModifiers(Modifiers.Public | Modifiers.Extern)
.Returns(TypeName.INT)
.AddParameter(TypeName.INT.MakeByRefType(), "a")
.AddParameter(TypeName.INT.MakeByRefType(ByRefTypeName.Kind.In), "b")
.Build())
.Build();
return classType;
}
下面是测试GeneratorTest类生成的代码:
using Wjybxx.Commons.Attributes;
using Commons.Tests.Apt;
using Wjybxx.Commons.Collections;
namespace Wjybxx.Commons.Apt;
[Generated("GeneratorTest")]
[MyCode(Name = "wjybxx", Age = 29)]
public class ClassBean
{
private int age;
private string name;
public readonly LinkedDictionary<string, object> blackboard = new LinkedDictionary<string, object>();
public ClassBean()
: this(29, "wjybxx") {
}
public ClassBean(int age, string name) {
this.age = age;
this.name = name;
}
public int Age {
get => age;
set => age = value;
}
private bool IsOnline { get; set; } = false;
/// <summary>
/// 求int的和
/// </summary>
public int Sum(int a, int b) {
return a + b;
}
/// <summary>
/// 求空int的和
/// </summary>
public extern int? SumNullable(int? a, int b);
/// <summary>
/// 求ref int的和
/// </summary>
public extern int SumRef(ref int a, in int b);
}
Roslyn支持
为让Poet包可以在任意场景使用,我将程序集进行了拆分,由Wjybxx.Commons.Apt对Roslyn进行支持。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- No dependencies.
-
net6.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Wjybxx.Commons.Poet:
| Package | Downloads |
|---|---|
|
Wjybxx.Commons.Apt
注解处理器工具 |
|
|
Wjybxx.Dson.Apt
Dson注解处理器,代码生成工具 |
GitHub repositories
This package is not used by any popular GitHub repositories.