這個問題在這里已經有了答案: 使用轉換器初始化 JsonSerializerOptions 1 個答案 11 小時前關閉。
該類JsonSerializerOptions具有以下屬性:
public IList<Serialization.JsonConverter> Converters { get; }
正如預期的那樣,此代碼作業正常:
using System.Text.Json.Serialization;
var options = new JsonSerializerOptions();
options.Converters.Add(new JsonStringEnumConverter());
正如預期的那樣,此代碼失敗:
var options = new JsonSerializerOptions
{
Converters = new List<JsonConverter> { new JsonStringEnumConverter() }
};
// `Property or indexer 'JsonSerializerOptions.Converters' cannot be assigned to -- it is read only`
到目前為止,一切都很好。但令我驚訝的是,這段代碼也能正常作業:
var options = new JsonSerializerOptions
{
Converters = { new JsonStringEnumConverter() }
};
最后一個例子到底發生了什么?我可能有精神失誤,但我不認為我以前遇到過這樣的語法。有人可以指出它記錄在哪里嗎?而且我不明白為什么它能夠規避屬性的缺乏setor init。
旁注:我要問的代碼是基于這篇文章的。
uj5u.com熱心網友回復:
最后一個例子到底發生了什么?我可能有精神失誤,但我不認為我以前遇到過這樣的語法。有人可以指出它記錄在哪里嗎?
這是集合初始值設定項語法。它記錄在這里。更直接地涉及只讀道具here。
某些類可能具有只讀屬性的集合屬性...由于無法為屬性分配新串列,因此您將無法使用到目前為止討論的集合初始化器語法。但是,仍然可以使用初始化語法通過省略串列創建來添加新條目。
此語法適用于“實作IEnumerable并具有Add適當簽名作為實體方法或擴展方法的集合型別”。
為了更深入地閱讀,請查看它更準確地說的規范:
應用集合初始值設定項的集合物件應為實作
System.Collections.IEnumerable或發生編譯時錯誤的型別。對于按順序指定的每個元素,應用普通成員查找來查找名為 的成員Add。如果成員查找的結果不是方法組,則會發生編譯時錯誤。否則,使用元素初始化器的運算式串列作為引數串列應用多載決策,并且集合初始化器呼叫結果方法。因此,集合物件應包含一個適用的實體或擴展方法,其中包含Add每個元素初始值設定項的名稱。
uj5u.com熱心網友回復:
這是 C# 中存在的一種非常晦澀的語法,但知道的人并不多。
最后一個示例中的代碼實際上等價于:
var options = new JsonSerializerOptions();
options.Converters.Add(new JsonStringEnumConverter());
它不分配給Converters屬性,但 intead 僅將值插入到串列中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/449498.html
