RSCG – DimonSmart.BuilderGenerator
name | DimonSmart.BuilderGenerator |
nuget | https://www.nuget.org/packages/DimonSmart.BuilderGenerator/ |
link | https://github.com/DimonSmart/BuilderGenerator |
author | Dmitry Dorogoy |
Generating builder pattern code for classes
This is how you can use DimonSmart.BuilderGenerator .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> </PropertyGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> <ItemGroup> <PackageReference Include="DimonSmart.BuilderGenerator" Version="1.25310.2229" /> </ItemGroup> </Project>
The code that you will use is
using Builder; var pOld = new Person(); pOld.FirstName = "Andrei"; pOld.LastName = "Ignat"; pOld.MiddleName = "G"; var build = new PersonBuilder() .FirstName(pOld.FirstName) .MiddleName("") .LastName(pOld.LastName) ; var pNew = build.Build(); System.Console.WriteLine(pNew.FullName()); System.Console.WriteLine(pOld.FullName());
namespace Builder; [DimonSmart.BuilderGenerator.Runtime.GenerateBuilder] public class Person { public string FirstName { get; set; } public string? MiddleName { get; set; } public string LastName { get; set; } public string FullName() { return FirstName + " " + MiddleName + " "+LastName; } }
The code that is generated is
using System; namespace DimonSmart.BuilderGenerator.Runtime { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] public sealed class GenerateBuilderAttribute : Attribute { public Type TargetType { get; set; } } }
// <auto-generated /> using System; using System.Reflection; using System.Linq.Expressions; namespace Builder { public class PersonBuilder { private readonly Builder.Person _instance = new Builder.Person(); public static PersonBuilder Create() { return new PersonBuilder(); } public PersonBuilder FirstName(string value) { _instance.FirstName = value; return this; } public PersonBuilder MiddleName(string? value) { _instance.MiddleName = value; return this; } public PersonBuilder LastName(string value) { _instance.LastName = value; return this; } public Builder.Person Build() { return _instance; } public static implicit operator Builder.Person(PersonBuilder builder) { return builder.Build(); } } public class PersonBuilder<TParent> { private readonly Builder.Person _instance = new Builder.Person(); private readonly TParent _parent; public PersonBuilder(TParent parent) { _parent = parent; } public PersonBuilder<TParent> FirstName(string value) { _instance.FirstName = value; return this; } public PersonBuilder<TParent> MiddleName(string? value) { _instance.MiddleName = value; return this; } public PersonBuilder<TParent> LastName(string value) { _instance.LastName = value; return this; } public TParent BuildAndSetParent<TProperty>(Expression<Func<Builder.Person, TProperty>> parentSelector) where TProperty : class { var memberExpr = (MemberExpression)parentSelector.Body; var propertyInfo = memberExpr.Member as PropertyInfo; if (propertyInfo == null) { var interfaceType = memberExpr.Member.DeclaringType; propertyInfo = interfaceType.GetProperty(memberExpr.Member.Name); } propertyInfo.SetValue(_instance, _parent); return _parent; } public Builder.Person Build() { return _instance; } } }
// <auto-generated /> using System; using System.Reflection; using System.Linq.Expressions; namespace Builder { public class PersonBuilderBuilder { private readonly Builder.Person _instance = new Builder.Person(); public static PersonBuilderBuilder Create() { return new PersonBuilderBuilder(); } public PersonBuilderBuilder FirstName(string value) { _instance.FirstName = value; return this; } public PersonBuilderBuilder MiddleName(string? value) { _instance.MiddleName = value; return this; } public PersonBuilderBuilder LastName(string value) { _instance.LastName = value; return this; } public Builder.Person Build() { return _instance; } public static implicit operator Builder.Person(PersonBuilderBuilder builder) { return builder.Build(); } } public class PersonBuilderBuilder<TParent> { private readonly Builder.Person _instance = new Builder.Person(); private readonly TParent _parent; public PersonBuilderBuilder(TParent parent) { _parent = parent; } public PersonBuilderBuilder<TParent> FirstName(string value) { _instance.FirstName = value; return this; } public PersonBuilderBuilder<TParent> MiddleName(string? value) { _instance.MiddleName = value; return this; } public PersonBuilderBuilder<TParent> LastName(string value) { _instance.LastName = value; return this; } public TParent BuildAndSetParent<TProperty>(Expression<Func<Builder.Person, TProperty>> parentSelector) where TProperty : class { var memberExpr = (MemberExpression)parentSelector.Body; var propertyInfo = memberExpr.Member as PropertyInfo; if (propertyInfo == null) { var interfaceType = memberExpr.Member.DeclaringType; propertyInfo = interfaceType.GetProperty(memberExpr.Member.Name); } propertyInfo.SetValue(_instance, _parent); return _parent; } public Builder.Person Build() { return _instance; } } }
// <auto-generated /> using System; using System.Reflection; using System.Linq.Expressions; namespace Builder { public class PersonBuilderContainerBuilder { private readonly Builder.Person _instance = new Builder.Person(); public static PersonBuilderContainerBuilder Create() { return new PersonBuilderContainerBuilder(); } public PersonBuilderContainerBuilder FirstName(string value) { _instance.FirstName = value; return this; } public PersonBuilderContainerBuilder MiddleName(string? value) { _instance.MiddleName = value; return this; } public PersonBuilderContainerBuilder LastName(string value) { _instance.LastName = value; return this; } public Builder.Person Build() { return _instance; } public static implicit operator Builder.Person(PersonBuilderContainerBuilder builder) { return builder.Build(); } } public class PersonBuilderContainerBuilder<TParent> { private readonly Builder.Person _instance = new Builder.Person(); private readonly TParent _parent; public PersonBuilderContainerBuilder(TParent parent) { _parent = parent; } public PersonBuilderContainerBuilder<TParent> FirstName(string value) { _instance.FirstName = value; return this; } public PersonBuilderContainerBuilder<TParent> MiddleName(string? value) { _instance.MiddleName = value; return this; } public PersonBuilderContainerBuilder<TParent> LastName(string value) { _instance.LastName = value; return this; } public TParent BuildAndSetParent<TProperty>(Expression<Func<Builder.Person, TProperty>> parentSelector) where TProperty : class { var memberExpr = (MemberExpression)parentSelector.Body; var propertyInfo = memberExpr.Member as PropertyInfo; if (propertyInfo == null) { var interfaceType = memberExpr.Member.DeclaringType; propertyInfo = interfaceType.GetProperty(memberExpr.Member.Name); } propertyInfo.SetValue(_instance, _parent); return _parent; } public Builder.Person Build() { return _instance; } } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/DimonSmart.BuilderGenerator