RSCG – DimonSmart.BuilderGenerator

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


Posted

in

, ,

by

Tags: