动态设置属性名称为Type的名称(typeof(T).Name)

问题描述 投票:0回答:1
var appsettings = JsonConvert.DeserializeObject<AppSettings<PersonModel>>(configData);

class AppSettings<T>
{
    [JsonProperty(PropertyName = typeof(T).Name)]
    public T dynproperty { get; set; }
}

Appsettings.json
内容:

{
  "PersonModel": {
    "name": "tempname",
    "active": true
  },
  "CarType":{
    "segment": "sedan",
    "seating" 5
  }
}

在上面的类中,

T
将是任何模型类。

dynproperty
的名称必须动态设置,以便在从 JSON 反序列化期间,反序列化器将选择相应的模型类型。

PS:我也愿意接受任何其他方法。

c# json types json.net
1个回答
0
投票

@Tarazed 是对的。您应该使用 JsonConverter。像这样的东西应该有效:

class DynamicPropertyNameConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jObject = JObject.Load(reader);

        var genericType = objectType.GenericTypeArguments[0];
        var genericTypeName = genericType.Name;

        var token = jObject[genericTypeName];

        if (token == null)
        {
            throw new JsonSerializationException($"Property '{genericTypeName}' not found.");
        }

        return token.ToObject(genericType, serializer);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

您的 AppSettings 类应该更改属性和属性,如下所示:

class AppSettings<T>
{
    [JsonConverter(typeof(DynamicPropertyNameConverter))]
    public T dynproperty { get; set; }
}

然后您可以检索设置:

var personSettings = JsonConvert.DeserializeObject<AppSettings<PersonModel>>(configData);
var carSettings = JsonConvert.DeserializeObject<AppSettings<CarModel>>(configData);

所以你必须创建

PersonModel
CarModel
,顺便说一句,你应该拥有它们。

要访问

personSettings
中的数据,您可以使用
personSettings.dynproperty.name

© www.soinside.com 2019 - 2024. All rights reserved.