gpt4 book ai didi

c# - 创建预定义的 JsonConvert 属性?

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:03 25 4
gpt4 key购买 nike

我的问题很简单..我想做的是:

[JsonConverter(typeof(MyConverter)]
object SomeProperty {get;set;}

但是能够将它写成一个自定义属性,这样我就可以简单地用一个预定义的 JsonConverter 属性来装饰我的属性。例如

[MyCustomConverter]
object SomeProperty {get;set;}

在这种情况下会被视为[JsonConverter(typeof(MyConverter))]

有什么想法吗?

Br,指数

最佳答案

这不是微不足道的,但如果您实现一个将您的属性考虑在内的自定义 IContractResolver,您就可以做到这一点。

执行此操作涉及几个步骤:

  1. 为扩展System.Attribute 的属性创建一个抽象 基类:

    public abstract class ConverterAttribute : Attribute
    {
    public abstract JsonConverter Converter { get; }
    }
  2. 接下来,您需要创建将实际使用您的属性的 IContractResolver1:

    public class CustomAttributeContractResolver : DefaultContractResolver
    {
    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
    JsonObjectContract contract =
    base.CreateObjectContract(objectType);

    IEnumerable<JsonProperty> withoutConverter =
    contract.Properties.Where(
    pr => pr.MemberConverter == null &&
    pr.Converter == null);

    // Go over the results of calling the default implementation.
    // check properties without converters for your custom attribute
    // and pull the custom converter out of that attribute.
    foreach (JsonProperty property in withoutConverter)
    {
    PropertyInfo info =
    objectType.GetProperty(property.UnderlyingName);

    var converterAttribute =
    info.GetCustomAttribute<ConverterAttribute>();

    if (converterAttribute != null)
    {
    property.Converter = converterAttribute.Converter;
    property.MemberConverter = converterAttribute.Converter;
    }
    }

    return contract;
    }
    }
  3. 创建覆盖 ConverterAttribute.Converter 的属性,返回您的自定义转换器:

    public class MyCustomConverterAttribute : ConverterAttribute
    {
    get { return new MyCustomConverter(); }
    }
  4. 用属性装饰你的类:

    public class MyClass
    {
    [MyCustomConverter]
    public object MyProperty { get; set; }
    }
  5. 序列化或反序列化时,在您使用的 JsonSerializerSettings 中指定契约解析器:

    var settings = new JsonSerializerSettings();
    settings.ContractResolver = new CustomAttributeContractResolver();

    string serialized = JsonConverter.SerializeObject(new MyClass());

我想说这可能不值得这个小好处——你真正做的只是保存几个字符,除非你的属性做其他事情。


1:我不确定MemberConverterConverter 之间有什么区别。 序列化时,只需要Converter属性,反序列化需要MemberConverter。我会继续挖掘,但希望有人能提供一些见解。看起来像 others have had this same question as well .

关于c# - 创建预定义的 JsonConvert 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142437/

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