gpt4 book ai didi

c# - 通过自定义 IContractResolver 修改/添加属性

转载 作者:行者123 更新时间:2023-11-30 23:08:53 25 4
gpt4 key购买 nike

我有一个类:

 public class MyClass
{
public MyEnum Foo{ get; set; }
}

在序列化期间,我想更改输出

{
"Foo": 1
}

{
"Foo": "EnumName"
}

我尝试创建一个 IValueProvider,但每次都遇到了死胡同。 (我的场景比描述的要复杂一些;我需要找到一种完全在 IContractResolver 中执行此操作的方法。)

最佳答案

您可以创建一个 custom ContractResolver继承自 DefaultContractResolver自动应用 StringEnumConverter枚举或可为空枚举的每个合约:

public class StringEnumContractResolver : DefaultContractResolver
{
readonly StringEnumConverter converter;

public StringEnumContractResolver() : this(true, false) { }

public StringEnumContractResolver(bool allowIntegerValue, bool camelCaseText)
{
this.converter = new StringEnumConverter { AllowIntegerValues = allowIntegerValue, CamelCaseText = camelCaseText };
}

protected override JsonPrimitiveContract CreatePrimitiveContract(Type objectType)
{
var contract = base.CreatePrimitiveContract(objectType);
var type = Nullable.GetUnderlyingType(contract.UnderlyingType) ?? contract.UnderlyingType;
if (type.IsEnum && contract.Converter == null)
contract.Converter = converter;
return contract;
}
}

注意事项:

  • 如果枚举类型已经应用了 JsonConverter,则优先于默认的 StringEnumConverter

  • 将转换器添加到 JsonPrimitiveContract对于枚举本身,而不是每个 JsonProperty对于返回枚举的成员,确保转换器应用于集合和字典中的枚举。

  • IValueProvider提供获取和设置值的方法,因此在实现此目的方面不如转换器方便。您需要将枚举值作为其中的 JSON 字符串执行嵌套序列化和反序列化,但它不是为此而设计的,因此无法访问 JSON 读取器、写入器或序列化器。此外,对于作为枚举的字典值或集合项,没有值提供程序。

  • here 所述,您可能希望缓存契约(Contract)解析器以获得最佳性能.

样本 .Net fiddle .

关于c# - 通过自定义 IContractResolver 修改/添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46231934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com