У меня есть класс Tempo
.Я могу свободно изменять:
public class Tempo
{
public Period Period { get; set; }
public int Value { get; set; } // in fact int should be a T here if it matters.
// more properties here
}
Period
- это класс из внешней зависимости, который я не могу изменить.
public class Period
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
public int Count { get; set; }
public string Foo { get; set; }
// more properties here
}
Period
- это огромный класс с множеством свойств, которыеЯ не хочу сериализоваться.Так что нет сладкого [JsonIgnore]
для меня.С Period
я хотел бы сохранить только свойства Start
и End
.
Я пытался использовать DefaultContractResolver
безуспешно:
class TempoResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var props = base.CreateProperties(type, memberSerialization);
return props
.Where(p => p.PropertyName != "Period") // how to filter subclass?
.ToList();
}
}
Я пытался использоватьJsonConverter
без успеха:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var jo = new JObject();
var type = value.GetType();
jo.Add("type", type.Name);
foreach (var prop in type.GetProperties().Where(x => x.CanRead))
{
object propVal = prop.GetValue(value, null);
if (propVal != null)
{
jo.Add(prop.Name,
JToken.FromObject(propVal, serializer)); // how to filter subclass?
}
}
jo.WriteTo(writer);
}
В обоих случаях я не уверен, как фильтровать Period
.Как я могу игнорировать свойства подкласса, которым я не владею во время сериализации?
Попробуйте онлайн!
Примечание:
- Я использую C# 6
- Я использую JSON.NET