Using a Field
, RefField
, Property
or DoNotUse
attribute on parameters.
Automatically generate private readonly
fields or private readonly ref readonly
fields or public
properties.
Forbid the use of primary constructor's parameters.
partial class C([Field(Name = "_a", AssignFormat = "{0}.ToString()", Type = typeof(string)), Field(Name = nameof(C._b)), Field, Property(Setter = "init", Summary = "Documentation")]int i) // type must be partial, but can be class / struct
{
# region Generated members
// private readonly string _a = i.ToString(); // generated field (with type and formated assignment)
// private readonly int _b = i; // generated field (with computed name)
// private readonly int _i = i; // generated field
/// <summary>
/// Documentation
/// </summary>
// private int I { get; init; } = i; // generated Property
# endregion
public void M0()
{
i++; // error on usage of i
Console.WriteLine(i); // error on usage of i
}
public void M1()
{
var i = 0;
i++; // don't error on usage of locals
Console.WriteLine(_i); // automaticaly created readonly field
Console.WriteLine(_a); // automaticaly created readonly field based on Name property
Console.WriteLine(I); // automaticaly created readonly property
}
}
ref partial struct Ref([RefField(IsReadonlyRef = false, IsRefReadonly = false), RefField(Name = nameof(Ref.I), Scope = "public")]int i)
{
# region Generated members
private ref int _i = ref i;
public readonly ref readonly int I = ref i;
# endregion
}
To enable the feature, type [Field]
, [RefField]
, [Property]
, or [DoNotUse]
before the primary parameter you want.
You can type as many attributes as you want on a single parameter (Except for DoNotUse
).
Attribute | Property | Comments | Default value |
---|---|---|---|
Field |
Name |
Property to modify the generated field name | _i (for a parameter named i ) |
IsReadnoly |
To generate the readonly modifier |
true |
|
Scope |
To change the scope of the generated property | private |
|
AssignFormat |
To change the assignment for that field | {0} |
|
Type |
To change the type for that field | same type as parameter | |
Summary |
The <summary> documentation tag |
null |
|
RefField |
Name |
Property to modify the generated field name | _i (for a parameter named i ) |
IsReadnolyRef |
To generate the readonly ref modifier |
true |
|
IsRefReadnoly |
To generate the ref readonly modifier |
true |
|
Scope |
To change the scope of the generated property | private |
|
Summary |
The <summary> documentation tag |
null |
|
Property |
Name |
Property to modify the generated field name | I (for a parameter named i ) |
Setter |
To generate the set , init or neither accessor along the get |
init |
|
Scope |
To change the scope of the generated property | public |
|
AssignFormat |
To change the assignment for that property | {0} |
|
Type |
To change the type for that property | same type as parameter | |
Summary |
The <summary> documentation tag |
null |
|
WithoutBackingStorage |
Generate the body of the accessors, without a backing storage | false |
|
DoNotUse |
AllowInMemberInit |
Change to allow the use of parameter in member initializer | true |
Code | Title | Message | Severity |
---|---|---|---|
PC01 |
Accessing a Primary Parameter | Can't access a primary parameter ('{0}') with a [Field], [RefField], [Property] or [DoNotUse] attribute, use {1} | Error |
PC02 |
Attribute generate nothing | Use this attribute only on primary parameter | Warning |
PC03 |
Attribute generate nothing | This member's name ('{0}') is already used | Warning Error when a member's name is already used in the type |
PC04 |
RefField in non ref struct | Can't apply [RefField] in non ref struct '{0}' | Error |
PC05 |
RefField on non ref parameter | Can't apply [RefField] on non ref parameter '{0}' | Error |
Property | Description | Default value |
---|---|---|
Fields | ||
PrimaryParameter_Field_DefaultScope |
The default scope for fields generation | private |
PrimaryParameter_Field_DefaultReadonly |
Should fields generates with readonly modifier |
true |
Ref Fields | ||
PrimaryParameter_RefField_DefaultScope |
The default scope for ref field generation |
private |
PrimaryParameter_RefField_DefaultReadonlyRef |
Should ref fields generates with readonly ref modifier |
true |
PrimaryParameter_RefField_DefaultRefReadonly |
Should ref fields generates with ref readonly modifier |
true |
Properties | ||
PrimaryParameter_Property_DefaultScope |
The default scope for properties generation | public |
PrimaryParameter_Property_DefaultSetter |
Should properties generates with set , init or neither accessor |
init |
Version | Date | Comments |
---|---|---|
v1.7.0 | 23/06/2024 | Added WithoutBackingStorage for Property |
v1.6.0 | 22/06/2024 | Fix a bug: accept arrays |
v1.5.1 | 19/05/2024 | Modified some errors message |
v1.5.0 | 18/05/2024 | Don't generate PC01 on a primary contructor base call |
v1.4.0 | 18/05/2024 | Added Conditional on generated attributes |
v1.3.4 | 18/05/2024 | Added <summary> generation |
v1.3.3 | 01/12/2023 | Renamed DontUse to DoNotUse |
v1.3.2 | 19/11/2023 | Don't generate the partial generated type if not needed |
v1.3.1 | 19/11/2023 | Fix a bug with member initialization |
v1.3.0 | 19/11/2023 | Added DontUseAttribute Add a code-fix for CS0282 Changed PropertyAttribute.WithInit to PropertyAttribute.Setter |
v1.2.0 | 25/08/2023 | Support for default values customization |
v1.1.0 | 15/08/2023 | dotnet/roslyn#67371 fixed (related to v0.4.6 ) |
v1.0.0 | 01/08/2023 | Added code-fixes |
v0.4.7 | 16/07/2023 | Don't error on nameof access or inside the same argument list usage |
v0.4.6.1 | 16/07/2023 | Fix typos in Readme.md |
v0.4.6 | 16/07/2023 | Added RefField attributeCurrently uses Unsafe.AsRef() due to a compiler bug dotnet/roslyn#67371 |
v0.4.5 | 18/05/2023 | Added Scope and IsReadonly properties on Field Scope property on Property defaulted to public |
v0.4.4 | 28/04/2023 | Added AssignFormat and Type properties |
v0.4.3 | 27/04/2023 | Field and Property now have using global::System |
v0.4.2 | 26/04/2023 | Bug-fix with previous update |
v0.4.1 | 25/04/2023 | More precise warnings/errors location |
v0.4.0 | 22/04/2023 | Added PC02 and PC03 warnings/errors |
v0.3.1 | 21/04/2023 | Added Scope property on Property attributeAttributes are internal |
v0.3.0 | 20/04/2023 | Added Property attribute |
v0.2.0 | 20/04/2023 | Support for Name fields and multiple Field |
v0.1.0 | 19/04/2023 | Initial release |