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:我也愿意接受任何其他方法。
@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
。