2017-01-19 1 views
0

Ich habe eine Klasse, wie unten dargestellt, und ich bin mit JSON.NET serialisiert/deserialisiertListe der bestellten Json Eigenschaften in C#

public class Car 
{ 
    [JsonProperty(Order = 3)] 
    public int CarId {get; set;} 
    [JsonProperty(Order = 1)] 
    public string CarName {get; set;} 
    [JsonIgnore] 
    public int CarMfgDate {get; set} 
    [JsonProperty(Order = 2)] 
    public int CarCapacity {get; set;} 
} 

Ich brauche eine Liste aller Json sichtbaren Objekte im selben zu erhalten Reihenfolge wie im Attribut 'JsonProperty' in der obigen Klasse definiert. Daher möchte ich, dass die Liste für die Klasse "Car" wie folgt initialisiert wird.

List<string> columns = GetOrderedJSONProperties(); 

Console.WriteLine(columns.Count); //Prints "3" 
Console.WriteLine(columns[0]); //Prints "CarName" 
Console.WriteLine(columns[1]); //Prints "CarCapacity" 
Console.WriteLine(columns[2]); //Prints "CarId" 

Bitte helfen Sie mir, die GetOrderedJSONProperties() Methode zu schreiben. Danke für die Hilfe!

Antwort

2

können Sie Linqs OrderBy Funktion für die Verwendung:

var columns = typeof(Car).GetProperties() 
    .Where(p => p.GetCustomAttribute<JsonIgnoreAttribute>() == null) 
    .OrderBy(p => p.GetCustomAttribute<JsonPropertyAttribute>()?.Order) 
    .Select(p => p.Name).ToList(); 
+0

Dieses mit wenigen Änderungen gearbeitet. Ich habe den geänderten Code unten eingefügt. 'var columns = typeof (Auto) .GetProperties() .Where (p => p.GetCustomAttributes (typeof (JsonIgnoreAttribute), false) == null || p.GetCustomAttributes (typeof (JsonIgnoreAttribute), false) .Length = = 0) .OrderBy (p => ((JsonPropertyAttribute []) p.GetCustomAttributes (typeof (JsonPropertyAttribute), false)) [0] .Order) .Wählen Sie (p => p.Name) .ToList(); '. Danke, dass Sie mich in die richtige Richtung weisen. Ich akzeptiere diese Antwort mit dem obigen Vorbehalt. – mantadt

+0

@lefou das Attribut Getter mit Typen gibt es als eine Erweiterung Methode: https://msdn.microsoft.com/en-us/library/hh194292(v=vs.110).aspx – Nico

+1

Danke für den Link @ Nico! – mantadt

Verwandte Themen