C#: Wie entfernen Sie alle null-Eigenschaften eines generischen Objekts mit reflection?
Möchte ich entfernen Sie alle null-Eigenschaften in ein generisches Objekt. Es muss nicht rekursiv sein, eine Ebene tief ist auch in Ordnung.
Der Grund, warum ich brauchen, ist für eine benutzerdefinierte JavascriptConvertor Umsetzung für die JSON-Serialisierung, die gibt mir: {"Name":"Aleem", "Age":null, "Type":"Mitarbeiter"}
Und ich möchte, überspringt das null-Objekt.
Die Funktion für diese Aufgabe nimmt in der objct und gibt einen Dictionary:
IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
So möchte ich entfernen Sie alle null-Eigenschaften von obj. Alle Eigenschaften verfügen über get-aber wenn die Eigenschaft nicht festgelegt ist, ist die get-zurück null
.
- Wie würden Sie ein Mitglied entfernen? Die Frage ist ein bisschen unklar...
- Wenn ich mich Recht erinnere, "Mitglieder" sind ebenfalls Eigenschaften und Methoden. Also ich weiß nicht, wie Sie würden "entfernen" entweder.
- Und wenn Sie null sind, da ist nicht mehr viel zu löschen gibt es?
- new { Foo = "lol", Bar = null } neue { Foo = "lol" }? Glaube nicht, dass das möglich ist, es sei denn, Sie erstellen Ihre eigene Art in Erinnerung. anonym (generische?) Typen sind Illusionen der compiler, schafft die Typen beim kompilieren...
- Auch kann eine Methode nicht null sein. Eine Eigenschaft, an und für sich keinen Wert hat (im Sinne von einem Feld), so müssen Sie rufen Sie einen get-accessor den Wert abrufen. Was ist, wenn eine Eigenschaft nicht über einen get-accessor? aleemb unbedingt braucht, um zu erklären, mehr für seine Frage Sinn zu machen.
- Ich habe geklärt, die Frage ein bisschen weiter.
- könnten Sie mehr von dem, was Ihr Serialize-Methode ist zu tun? Es würde die Dinge ein bisschen klarer ... für mich zumindest 🙂
- Hinzugefügt eine generische json-serializer-Erweiterung-Methode, sondern erfordert .net 3.5
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie implementieren Ihre eigenen JavaScriptConverter zu handhaben Serialisierung von Ihrem Typ. Dann erhalten Sie volle Kontrolle darüber, wie die Eigenschaften serialisiert werden.
@Richards Antwort bietet eine schöne Umsetzung von der Serialize-Methode.
Dem Deserialisieren Methode wäre, ganz ähnlich, aber ich überlasse die Umsetzung bis zu Sie. Jetzt der einzige Nachteil mit JavaScriptConverter ist, dass es um die unterstützten Typen von irgendwo. Entweder fest, wie diese:
...oder machen Sie es konfigurierbar, z.B. über den Konstruktor der Klasse.
Etwas entlang der Linien der folgenden wird wahrscheinlich den trick tun:
NB: diese Methode funktioniert nicht mit indizierten Eigenschaften.
Möchten Sie möglicherweise erstellen Sie eine Art von Umhüllung Objekt, die nur macht-Mitglieder, was es ist, umbrechen, wenn Sie nicht null sind.
Können Sie auch prüfen wollen, mit der version 4 von C#. Von der wikipedia-Eintrag für die duck-typing: