`- Typ.GetProperties` - Eigenschaft, um

Kurze Version

In der MSDN-Dokumentation für - Typ.GetProperties besagt, dass die collection gibt es nicht garantiert ist, werden in alphabetischer Reihenfolge oder in der Reihenfolge der Deklaration, obwohl läuft ein einfacher test zeigt, dass im Allgemeinen wird es wieder in der Reihenfolge der Deklaration. Gibt es bestimmte Szenarien, die Sie kennen, wo dies nicht der Fall ist? Darüber hinaus, was ist die empfohlene alternative?

Ausführliche Version

Erkenne ich die MSDN-Dokumentation für - Typ.GetProperties Staaten:

Der GetProperties-Methode nicht zurück, Eigenschaften, die in einer bestimmten
um, wie alphabetisch oder in der Reihenfolge der Deklaration. Ihr code muss nicht
hängt von der Reihenfolge, in der die Eigenschaften zurückgegeben werden, weil
Reihenfolge variiert.

also es gibt keine Garantie, dass die Sammlung von der Methode zurückgegeben werden, bestellt jede spezifische Art und Weise. Basierend auf einigen tests, die ich gefunden habe, im Gegenteil, dass die zurückgegebenen Eigenschaften erscheinen in der Reihenfolge, wie Sie definiert sind in der Typ.

Beispiel:

class Simple
{
    public int FieldB { get; set; }
    public string FieldA { get; set; }
    public byte FieldC { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Simple Properties:");
        foreach (var propInfo in typeof(Simple).GetProperties())
            Console.WriteLine("\t{0}", propInfo.Name);
    }
}

Ausgabe:

Simple Properties:
        FieldB
        FieldA
        FieldC

Einem solchen Fall, dass dieser unterscheidet sich nur geringfügig ist, wenn der Typ in Frage, die ein Elternteil hat, der hat auch Eigenschaften:

class Parent
{
    public int ParentFieldB { get; set; }
    public string ParentFieldA { get; set; }
    public byte ParentFieldC { get; set; }
}

class Child : Parent
{
    public int ChildFieldB { get; set; }
    public string ChildFieldA { get; set; }
    public byte ChildFieldC { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Parent Properties:");
        foreach (var propInfo in typeof(Parent).GetProperties())
            Console.WriteLine("\t{0}", propInfo.Name);

        Console.WriteLine("Child Properties:");
        foreach (var propInfo in typeof(Child).GetProperties())
            Console.WriteLine("\t{0}", propInfo.Name);

    }
}

Ausgabe:

Parent Properties:
        ParentFieldB
        ParentFieldA
        ParentFieldC
Child Properties:
        ChildFieldB
        ChildFieldA
        ChildFieldC
        ParentFieldB
        ParentFieldA
        ParentFieldC

Was bedeutet, dass die GetProperties Methode geht die Vererbungskette von unten nach oben bei der Entdeckung der Eigenschaften. Das ist in Ordnung und kann als solche behandelt.

Fragen:

  1. Gibt es bestimmte Situationen, in denen das beschriebene Verhalten abweichen würde, die ich verpasst habe?
  2. Wenn je nach Auftrag wird nicht empfohlen, was dann ist die empfohlene Vorgehensweise?

Eine scheinbar naheliegende Lösung wäre, um ein benutzerdefiniertes Attribut, das anzeigt, in welcher Reihenfolge die Eigenschaften sollte erscheinen (Ähnlich wie die Order Eigenschaft auf die DataMember - Attribut). So etwas wie:

public class PropOrderAttribute : Attribute
{
    public int SeqNbr { get; set; }
}

Und dann umsetzen wie:

class Simple
{
    [PropOrder(SeqNbr = 0)]
    public int FieldB { get; set; }
    [PropOrder(SeqNbr = 1)]
    public string FieldA { get; set; }
    [PropOrder(SeqNbr = 2)]
    public byte FieldC { get; set; }
}

Aber so viele gefunden haben, dies wird zu einem ernsthaften problem Wartung, wenn Ihr Typ hat 100 Eigenschaften und man muss hinzufügen, einen zwischen dem ersten 2.

UPDATE

Die hier gezeigten Beispiele sind einfach nur für demonstrative Zwecke. In meinem speziellen Szenario, definiere ich eine message-format mit einer Klasse, dann Durchlaufen Sie die Eigenschaften der Klasse und schnappen Sie sich Ihre Attribute, um zu sehen, wie ein bestimmtes Feld in der Nachricht sollte demarshaled. Die Reihenfolge der Felder in der Nachricht ist bedeutsam, so ist die Reihenfolge der Eigenschaften in meiner Klasse muss erheblich sein.

Es funktioniert derzeit nur durch Iteration über die Rückkehr Sammlung von GetProperties, aber seit Sie in der Dokumentation heißt es, es wird nicht empfohlen, ich war auf der Suche, um zu verstehen, warum und welche andere Optionen habe ich?

  • Was wollen Sie erreichen? Warum brauchen Sie einen Auftrag? Vielleicht gibt es eine andere Möglichkeit
  • Grundsätzlich ist die Dokumentation sagt: "verlassen Sie sich nicht auf eine Bestellung", aber in der aktuellen Implementierung wird es wohl auch haben, eine konsistente Reihenfolge. Die Dokumentation ist präzise, "verlassen Sie sich nicht auf eine Bestellung" bedeutet nicht "es wird variieren". Es bedeutet "es könnte variieren". Q1: können Sie nicht davon ausgehen, es wird immer so sein, wie du beschrieben hast wieder. Q2: verlassen Sie sich nicht auf eine Bestellung. Um es sich selbst, wenn Sie brauchen eine geordnete Liste.
  • 1. Sie völlig nicht abhängig sein sollten von der Reihenfolge der Deklaration - das ist sicher, da es hängt von der Implementierung der Laufzeitumgebung (es könnte sogar von version zu version).
  • 2.Warum nicht Sie Sortieren Eigenschaften alphabetisch? Oder brauchen Sie eine andere Sorte bestellen?
  • Ich habe aktualisiert die Frage mit dem Zusammenhang mit der Frage. Welche alternativen habe ich?
  • Wie ich schon sagte, wenn Sie brauchen, konsistente Reihenfolge, um Sie mit Namen. Oder lagern Sie die Feldnamen zusammen mit den Werten

InformationsquelleAutor M.Babcock | 2012-01-15
Schreibe einen Kommentar