AutoConstructor 1.2.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package AutoConstructor --version 1.2.0                
NuGet\Install-Package AutoConstructor -Version 1.2.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.2.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.2.0                
#r "nuget: AutoConstructor, 1.2.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.2.0

// Install AutoConstructor as a Cake Tool
#tool nuget:?package=AutoConstructor&version=1.2.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 checks 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

ACONS01

The AutoConstructor attribute is used on a class that is not partial.

ACONS02

The AutoConstructor attribute is used on a class without fiels to inject.

ACONS03

The AutoConstructorIgnore attribute is used on a field that won't already be processed.

ACONS04

The AutoConstructorInject attribute is used on a field that won't already be processed.

ACONS05

The AutoConstructorIgnore or AutoConstructorInject are used on a class without the AutoConstructor attribute.

ACONS06

A type specified in AutoConstructorInject attribute does not match the type of another parameter with the same name.

In the folowing sample, both fields will be injected with guid as parameter name, but one of type string and the other of type Guid, preventing the generator from running.

public partial class Test
{
    [AutoConstructorInject("guid.ToString()", "guid", typeof(Guid))]
    private readonly string _guid2;
    private readonly string _guid;
}
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,588 9/22/2024
5.5.0 4,647 6/26/2024
5.5.0-beta.1 55 6/24/2024
5.4.1 477 6/22/2024
5.4.0 3,899 5/23/2024
5.3.0 5,367 3/16/2024
5.3.0-beta.2 64 3/15/2024
5.3.0-beta.1 95 3/12/2024
5.2.1 13,121 3/4/2024
5.2.0 4,699 12/19/2023
5.1.0 7,432 11/23/2023
5.0.1 263 11/22/2023
5.0.0 6,153 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,732 7/18/2023
4.1.0 3,734 7/8/2023
4.0.3 7,182 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,587 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 423 8/2/2021
1.0.1 471 7/24/2021
1.0.0 425 7/23/2021