Refaktor ShouldSerialize () w klasie… czy mogę używać IContractResolver?

Mam interfejs API, który zwraca dużą listę funkcji samochodu .... wszystkie są bool lub ints ... i zasadniczo chcę wyświetlać tylko te, które zwracają wartości prawdziwe lub> 0 dla int.

Korzystam z JSON.net, więc używam właściwości ShouldSerialize (), aby określić, czy powinienem serializować właściwość w oparciu o jej wartość, a mój kod wygląda tak:

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
}

To działa świetnie i daje mi wyniki, których szukam, ale zastanawiałem się, czy istnieje sposób na ponowne obliczenie tego, aby moja klasa nie była zaśmiecona wszystkimi właściwościami ShouldSerialize ()?

SzukałemCopyConditional właściwości zIContractResolver nahttp://james.newtonking.com/projects/json/help/index.html?topic=html/ConditionalProperties.htm i wygląda na to, że można go użyćIContractResolver do tego celu, ale wciąż wydaje mi się, że kończy się na wielu kodach, które wydają się nie zmieniać współczynnika

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;
  }
}

i ta metoda używająca ShouldSerializeContractResolver nie wydaje się usuwać właściwości z klasy, jeśli jest fałszywa ... każda pomoc jest bardzo mile widziana

questionAnswers(1)

yourAnswerToTheQuestion