How do I target attributes for a record class?

8.6k views Asked by At

When defining a record class, how do I target the attributes to the parameter, field or property?

For instance, I would like to use JsonIgnore but this doesn't compile as it has an attribute usage restriction to the field or property:

record Person(string FirstName, string LastName, [JsonIgnore] int Age);
2

There are 2 answers

3
Daniel A. White On BEST ANSWER

To target the various parts of the expanded class, use the appropriate attribute target. For instance:

// Target the property, use `property`
record Person(string FirstName, string LastName, [property: JsonIgnore] int Age);

// Target the backing field of the property, use `field`
record Person(string FirstName, string LastName, [field: JsonIgnore] int Age);

// Target the constructor parameter, use `param`
record Person(string FirstName, string LastName, [param: SomeParamAttribute] int Age);
0
KUTlime On

A real-life example:

This record

public record GetAccountHolderParameters([property: JsonProperty("accountHolderCode")] string Code, [property: JsonProperty("showDetails")] bool ShowDetails);

or this preferred syntax which is better to read

public record GetAccountHolderParameters(
    [property: JsonProperty("accountHolderCode")] string Code,
    [property: JsonProperty("showDetails")] bool ShowDetails
);

is equivalent to

public class GetAccountHolderParameters
{
    [JsonProperty(PropertyName = "accountHolderCode")]
    public string Code { get; set; }

    [JsonProperty(PropertyName = "showDetails")]
    public bool ShowDetails { get; set; }
}

Note about ASP.NET Core request parameters

You can't apply validation attributes [property: ... ] to your request parameters, see this question.

You will receive InvalidOperationException(...).

For details, see this issue.