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