AutoConstructor 1.1.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package AutoConstructor --version 1.1.0                
NuGet\Install-Package AutoConstructor -Version 1.1.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="AutoConstructor" Version="1.1.0">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AutoConstructor --version 1.1.0                
#r "nuget: AutoConstructor, 1.1.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.
// Install AutoConstructor as a Cake Addin
#addin nuget:?package=AutoConstructor&version=1.1.0

// Install AutoConstructor as a Cake Tool
#tool nuget:?package=AutoConstructor&version=1.1.0                

AutoConstructor

NuGet GitHub release GitHub license ci.yml

C# source generator that generates a constructor from readonly fields in a class.

Installation

  • Grab the latest package on NuGet.

Requirements

  • Visual Studio 16.9+ is needed
  • .NET SDK 5.0.300+ is needed

How to use

For any class where the generator will be used:

  • Mark the class as partial
  • Use AutoConstructorAttribute on the class

By default, all private readonly without initialization will be used. The will be injected with the same name without any leading _.

Fields marked with AutoConstructorIgnoreAttribute will be ignored.

Use AutoConstructorInjectAttribute to customize the behavior, usualy when the injected parameter and the fields do not have the same type. It takes three parameters:

  • Initializer: a string that will be used to initialize the field (by example myService.GetData())
  • ParameterName: the name of the parameter to used in the constructor (by example myService)
  • InjectedType: the type of the parameter to used in the constructor (by example IMyService)

When using AutoConstructorInjectAttribute, the parameter name can be shared across multiple fields, and even use a parameter from another field not annotated with AutoConstructorInjectAttribute, but type must match.

Configuration

By default, null ckecks with ArgumentNullException will be generated when needed. To disable this behavior, set AutoConstructor_DisableNullChecking to false in the project file:

<AutoConstructor_DisableNullChecking>true</AutoConstructor_DisableNullChecking>

Sample

The following code

[AutoConstructor]
partial class Test
{
    private readonly string _name;

    // Won't be injected
    private readonly Uri _uri = new Uri("/non-modified", UriKind.Relative);

    // Won't be injected
    [AutoConstructorIgnore]
    private readonly DateTime _dateNotTaken;

    // Won't be injected
    private int? _toto;

    // Support for nullables
    private readonly DateTime? _date;

    // Support for generics
    private readonly List<DateTime> _items;

    // Inject with custom initializer
    [AutoConstructorInject("guid.ToString()", "guid", typeof(Guid))]
    private readonly string _guidString;

    // Use existing parameter defined with AutoConstructorInject
    [AutoConstructorInject("guid.ToString().Length", "guid", typeof(Guid))]
    private readonly int _guidLength;

    // Use existing parameter from a basic injection
    [AutoConstructorInject("name.ToUpper()", "name", typeof(string))]
    private readonly string _nameShared;
}

will generate

public Test(string name, System.DateTime? date, System.Collections.Generic.List<System.DateTime> items, System.Guid guid)
{
    this._name = name ?? throw new System.ArgumentNullException(nameof(name));
    this._date = date ?? throw new System.ArgumentNullException(nameof(date));
    this._items = items ?? throw new System.ArgumentNullException(nameof(items));
    this._guidString = guid.ToString() ?? throw new System.ArgumentNullException(nameof(guid));
    this._guidLength = guid.ToString().Length;
    this._nameShared = name.ToUpper() ?? throw new System.ArgumentNullException(nameof(name));
}

Diagnostics

Rule ID Category Severity Notes
ACONS01 Usage Warning ClassWithoutPartialAnalyzer, Documentation
ACONS02 Usage Warning ClassWithoutFieldsToInjectAnalyzer, Documentation
ACONS03 Usage Info IgnoreAttributeOnNonProcessedFieldAnalyzer, Documentation
ACONS04 Usage Warning InjectAttributeOnIgnoredFieldAnalyzer, Documentation
ACONS05 Usage Warning IgnoreOrInjectAttributeOnClassWithoutAttributeAnalyzer, Documentation
There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on AutoConstructor:

Repository Stars
Sergio0694/ComputeSharp
A .NET library to run C# code in parallel on the GPU through DX12, D2D1, and dynamically generated HLSL compute and pixel shaders, with the goal of making GPU computing easy to use for all .NET developers! 🚀
Version Downloads Last updated
5.6.0 2,173 9/22/2024
5.5.0 4,602 6/26/2024
5.5.0-beta.1 55 6/24/2024
5.4.1 477 6/22/2024
5.4.0 3,896 5/23/2024
5.3.0 5,343 3/16/2024
5.3.0-beta.2 64 3/15/2024
5.3.0-beta.1 95 3/12/2024
5.2.1 12,834 3/4/2024
5.2.0 4,699 12/19/2023
5.1.0 7,407 11/23/2023
5.0.1 263 11/22/2023
5.0.0 6,151 11/7/2023
5.0.0-beta.2 77 11/6/2023
5.0.0-beta.1 92 11/2/2023
4.1.1 8,682 7/18/2023
4.1.0 3,656 7/8/2023
4.0.3 7,177 4/24/2023
4.0.2 2,542 4/19/2023
4.0.1 1,587 3/29/2023
4.0.0 348 3/27/2023
3.2.5 5,585 10/15/2022
3.2.4 375 10/7/2022
3.2.3 688 6/28/2022
3.2.2 436 6/27/2022
3.2.1 462 6/11/2022
3.2.0 450 5/20/2022
3.1.1 448 5/14/2022
3.0.0 450 4/1/2022
3.0.0-beta.2 147 3/9/2022
3.0.0-beta.1 992 2/9/2022
2.3.0 523 1/27/2022
2.2.0 448 1/22/2022
2.1.0 435 1/21/2022
2.0.2 338 11/11/2021
1.3.0 448 9/21/2021
1.2.1 350 8/28/2021
1.2.0 350 8/28/2021
1.1.0 341 8/26/2021
1.0.2 421 8/2/2021
1.0.1 471 7/24/2021
1.0.0 425 7/23/2021