在C#中覆盖基类的Json.NET注释

3

我正在使用一个公共库,它公开了一个名为SwaggerDocument的模型。该库通过注释添加了一些序列化逻辑,以指定在序列化和反序列化过程中应忽略什么,以及应该应用什么顺序:

    [Newtonsoft.Json.JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 6, PropertyName = "basePath")]
public string BasePath;

我希望更改这些注释,而不必创建自己的类并复制所有其他逻辑。我能够扩展这个类并覆盖注释吗?例如:

MySwaggerDocument: SwaggerDocument 
{
    @override
    [Newtonsoft.Json.JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate, Order = 4, PropertyName = "basePath")]
    public string BasePath;
}

我相信你可以覆盖数据注释。但是,由于它们不是虚拟的,你必须将基本属性覆盖为新属性。然而,在这里有一个问题,流程中如何注入 MySwaggerDocument 对象? - user1672994
1个回答

2

虽然这个方案可行,但并不是理想的解决方法。

你可以使用以下策略来公开基类的一些属性,这些属性会影响到您自定义派生类中的顺序。

缺点是需要声明一些基类的属性,但正如您所看到的,这背后的逻辑非常简单(get/set语法是C# 7.0)。

using Newtonsoft.Json;
using System;

namespace JsonTest
{
    public class Base
    {
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 1, PropertyName = "A")]
        public string A { get; set; }

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 2, PropertyName = "X")]
        public string X { get; set; }

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 3, PropertyName = "B")]
        public string B { get; set; }
    }

    public class Derived : Base
    {
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 4, PropertyName = "C")]
        public string C { get; set; }

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 5, PropertyName = "X")]
        public new string X
        {
            get => base.X;
            set => base.X = value;
        }

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate, Order = 6, PropertyName = "D")]
        public string D { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Base b = new Base() { A = "a", B = "b", X = "x" };
            string serB = JsonConvert.SerializeObject(b);
            Console.WriteLine($"Serialized base class:\r\n {serB}");

            Derived d = new Derived() { A = "a", B = "b", C = "c", D = "d", X = "x" };
            string serD = JsonConvert.SerializeObject(d);
            Console.WriteLine($"Serialized derived class:\r\n {serD}");
        }
    }
}

输出:

Serialized base class:
 {"A":"a","X":"x","B":"b"}
Serialized derived class:
 {"A":"a","B":"b","C":"c","X":"x","D":"d"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接