Frage

Der Titel ziemlich viel sagt alles. Als ich einige Überlegungen über meine Klassen mache, werden die MemberInfo.GetCustomAttributes () -Methode, die Reihenfolge der Attribute auf einem Element erhalten, oder nicht? Die offizielle Dokumentation sagt nichts der einen oder der anderen Seite.


Falls Sie sich fragen, warum ich das brauchen würde, ist hier die ausführliche Erklärung. Es ist langwierig und nicht für die Frage erforderlich, wie es jetzt gestellt wird, aber vielleicht kann jemand mit einer alternativen Lösung für das Problem größer kommen, die nicht auf Attribut-Enumeration, um mit sich bringt angewiesen zu sein.

Ich versuche, einen flexiblen Rahmen für eine (ASP.NET) Anwendung zu machen, die erwartet wird, eine lange Lebensdauer haben. Im Laufe wird es viele Formen gewinnen, die aus dem Menü zugänglich sein müssen. Um das Leben einfacher für die Entwickler zu machen zu kommen Ich habe ein MenuItemAttribute gemacht, die Sie zu einem Formular Klasse anwenden können. Dieses Attribut hat eine unbegrenzte Anzahl von String-Parameter in seinem Konstruktor, der einen Entwickler ermöglicht angeben, wo genau wird das Formular im Menü befindet. Ein typisches Anwendungsbeispiel wäre so etwas wie [MenuItem("Company", "Clients", "Orders")] sein, die dann, dass das Menü sollte ein Element „Gesellschaft“, unter denen bedeuten würde es einen Punkt „Clients“ sein würde, unter denen es ein Punkt „Orders“ wäre - die dann das Formular öffnen würde . Eine einzige Form kann mehrere dieser Attribute hat, wenn nötig -. Es wird dann von mehreren Stellen im Menü acessible sein

Offensichtlich ist das ganze Menü wird durch Aufzählen durch alle Klassen in meinen Baugruppen im laufenden Betrieb gebaut und für dieses Attribut zu suchen. Doch vor kurzem habe ich eine Anfrage bekommen, dass die Menüpunkte in einer vorgegebenen Art und Weise sortiert werden sollen. Formulare, die Funktionalität hat im Zusammenhang sollten miteinander im Menü der nächsten sein. Beachten Sie, dass dies nicht alphabetische Sortierung ist, sondern eine vorgegebene Reihenfolge, dass die Entwickler angeben.

Das bringt dann das Problem - wie kann ich die Reihenfolge in diesen Attributen angeben? Da ein MenuItemAttribute eine ganze Hierarchie beschreibt, soll die Reihenfolge Spezifikation auch Bestellnummern für die gesamte (oder zumindest einen Teil) der Hierarchie umfassen. Eine Auftragsnummer nur für die untere Ebene der Hierarchie ist nicht ausreichend.

Ich könnte ein anderes Attribut machen - MenuItemOrderHintAttribute, aber das würde dann Probleme mit Fällen bringen, wenn es mehr als ein MenuItemAttribute ist. Daraus ergibt sich die ursprüngliche Frage.

I könnte auch die MenuItemAttribute erstrecken entweder zwei Arrays oder ein Array von Paaren zu nehmen, aber die dann der Syntax würden viel komplizierter machen. Die letzte Idee ist, dass ich die Saiten haben spezielles Format machen konnte, aber das wäre ziemlich chaotisch IMHO.


OK, ich habe eine andere Idee. Lassen Sie uns die Bestellung verwenden, die Jon Skeet vorgeschlagen. Dies ermöglicht es den Auftrag für die letzte Stufe der Hierarchie angeben, nicht die höheren. Aber ich konnte das Attribut ändern, so dass es nicht nur auf Klassen gilt, sondern auch für die Baugruppe selbst. In diesem Fall würde der Menüpunkt nicht eine zugehörige Form hat. Auf der Montageebene könnten diese Attribute dann verwendet werden, um die Ordnung unter den höheren Ebenen der Hierarchie angeben.

Dies ist dann ein Kompromiss zwischen einem zentralen und dezentralen Menüsystem. Alle Gedanken, warum dies wäre eine schlechte Idee?

War es hilfreich?

Lösung

würde ich einen einzigen zusätzlichen (optional) Wert im MenuItemAttribute Konstruktor setzen, die „Ordnung“ oder „Priorität“ ist:

[MenuItem(0, "Company", "Clients", "Orders")]
[MenuItem(1, "Foo", "Bar", "Baz")]

Ich sage nicht, es schön sein würde, aber es würde Sie effektiv ermöglichen, die Bestellung angeben.

Andere Tipps

Die lexikalische Reihenfolge der Elemente in einer Datei absolut nicht garantiert in ohnehin in dem resultierenden CIL Baugruppen beibehalten wird noch in den Ergebnissen zurückgegeben von Reflexion zu respektieren. Diese Reihenfolge ist nicht einmal garantiert das gleiche über wiederholte Anrufe innerhalb der gleichen Anwendungsdomäne sein!

Beachten Sie, dass MS diese Reihenfolge in der Vergangenheit in anderen Teilen der Reflexion gebrochen hat (in Anbetracht, wie sie es tat, dass dies tatsächlich einige Probleme verursachte für einige ihren Code), so dass auch wenn es im Moment zu arbeiten, geschieht es nichts diesen Bruch in Zukunft oder auf verschiedene Plattformen zu stoppen.

Betrachten Sie Ihr Attribut Modell Ändern der semantischen Informationen zu ermöglichen, zum Ausdruck direkt anstatt auf Bestellung zu verlassen.

Leider nein, Sie können nicht garantieren, dass die Reihenfolge die gleiche sein wird wie die Reihenfolge, in der sie angegeben ist.

Edit: eine Abhilfe

Disclaimer: Ich entschuldige mich vor der Zeit, wenn ich Ihre ultimative Problem bin Missverständnis

.

Es klingt, als ob Sie müssen n und die Reihenfolge dieser Strings müssen in der Lage MenuItemAttribute Anzahl von Strings passieren MenuItemAttribute halten, wie durch den Entwickler in den Attributen Konstruktor eingegeben.

Hier ist eine mögliche Lösung:

Haben MenuItemAttribute verwenden, um ein LinkedList<String> seinen Zustand zu halten. Dann können Sie die params String[] in Ihrem Konstruktor iterieren und sie den LinkedList<String> hinzuzufügen, die die Ordnung aufrechterhalten würden.

Es scheint mir, dass Ihr Problem wirklich auf die Tatsache zurückzuführen, dass die Formen spezifiziert werden, wo sie in Ihrem Menü angezeigt wird, was bedeutet, dass Sie versuchen, ein Menü zu erstellen, indem man alle Formen in einer Baugruppe vereint. Es könnte einfacher sein, wenn Sie die Struktur des Menüs getrennt von Formen an, und lösen Sie die Formulare aus verschiedenen propeties / Attribute für die Klasse definiert einen Menüpunkt entspricht.

z.

public class MenuItem
{
    string Text { get; }
    Type FormType { get; }
    ICollection<MenuItem> SubItems { get; }
}

Dann, wenn ein Menüpunkt ausgewählt wird, löst die Form irgendwie und anzeigen. Dieser Ansatz hat den Nachteil, dass alle neuen Formen der Menüstruktur zusammen mit dem Formular Angabe selbst eine Änderung des Codes erfordern müssen, aber das wird ganz geringfügige ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top