💭

C# のプライマリー コンストラクターに属性を設定したい

2024/01/18に公開

プライマリー コンストラクターを持ってるクラスに追加でコンストラクターを追加したら System.Text.Json が、そのクラスのデシリアライズ出来ないという例外を出すようになりました。
エラーメッセージは以下のような感じです。

Error:System.NotSupportedException: Deserialization of types without a parameterless constructor, a singular parameterized constructor, or a parameterized constructor annotated with 'JsonConstructorAttribute' is not supported. Type 'クラス名'.

これは、まぁせやなって感じなんですが、じゃぁプライマリーコンストラクターに JsonConstructorAttribute を付ければいいじゃんと思ったら付け方がわからなかったのでメモです。
ドキュメント的には以下のドキュメントの Attributes targeting primary constructors の所に書いてあります。

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-12.0/primary-constructors#attributes-targeting-primary-constructors

指定方法

クラス定義(またはレコードの定義)の所に [method: 属性名] という形で指定します。

[method: JsonConstructor]
public record Hoge(string Foo, string Bar)
{
    public Hoge(string Foo) : this(Foo, "Bar")
    {
    }
}

これで無事 System.Text.Json も例外を吐かなくなりました。

Microsoft (有志)

Discussion