Refactor of ShouldSerialize () в классе ... я могу использовать IContractResolver?
У меня есть API, который возвращает большой список функций автомобиля .... все они либо bool или ints ... и в основном я хочу отображать только те, которые возвращают истинные значения или>0 для целых
Я использую JSON.net, чтобы я мог использовать свойство ShouldSerialize (), чтобы определить, следует ли мне сериализовать свойство на основе его значения, и мой код выглядит следующим образом:
public class Features
{
public bool ABS { get; set; }
public bool ShouldSerializeABS()
{
// don't serialize the ABS property if ABS is false
return (ABS != false);
}
public bool Immobiliser { get; set; }
public bool ShouldSerializeImmobiliser ()
{
// don't serialize the Immobiliser property if Immobiliser is false
return (Immobiliser != false);
}
public int BHP { get; set; }
public bool ShouldSerializeBHP ()
{
// don't serialize the BHP property if BHP is false
return (BHP != 0);
}
//..... etc
}
Это прекрасно работает и дает мне результаты, которых я добиваюсь, однако мне было просто интересно, есть ли способ переформулировать это так, чтобы мой класс не загромождался всеми свойствами ShouldSerialize ()?
Я смотрел вCopyConditional
свойства сIContractResolver
наhttp://james.newtonking.com/projects/json/help/index.html?topic=html/ConditionalProperties.htm и похоже, что можно было бы использоватьIContractResolver
для этой цели, но я все еще, кажется, в конечном итоге с большим количеством кода, который, кажется, не рефакторинг
public class ShouldSerializeContractResolver : DefaultContractResolver
{
public new static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (property.DeclaringType == typeof(Features) && property.PropertyName == "ABS")
{
property.ShouldSerialize =
instance =>
{
Features e = (Features)instance;
return e.ABS != false;
};
}
if (property.DeclaringType == typeof(Features) && property.PropertyName == "Immobiliser")
{
property.ShouldSerialize =
instance =>
{
Features e = (Features)instance;
return e.Immobiliser != false;
};
}
return property;
}
}
и этот метод с использованием ShouldSerializeContractResolver, по-видимому, не удаляет свойство из класса, если оно ложно ... любая помощь очень ценится