Frage

Ich habe ein Problem vor kurzem über das Radfahren zwischen Konstanten einer ENUM-Klasse in .net encourted (das von meiner OWL Klasse erstellt wird, von Rowlex OwlGrinder). Problem wurde durch Verwendung von .net Reflexion (dank der großen Hilfe lieber Herr Jon Skeet) gelöst: Stackoverflow: Problem-cycling-Enum-Klasse-Werte

Dies wird durch die Lösung, begann ich es zu benutzen. einen Dropdownlist ausgewählt Wertes zu einem der ENUM-Klasseninstanzen Nach dem Abgleich hatte ich das ausgewählte Objekt (= Sprache) zu meinem RDF Subjekt (= learningResource), über ein Prädikat (= hasLanguage).

zu erklären,
//learningResource is a new RDF subject, hasLanguage is predicate, and there
        //is a new value for it - Language.

        System.Reflection.FieldInfo[] resLanFields =
            typeof(Language).GetFields();

        for (int i = 0; i < resLangFields.Length; i++)
        {
            if (resLanFields[i].Name.Equals(dropDownList_lang.SelectedValue))
                learningResource.hasLanguage = ??? //i-th constant of Language
        }

Nun das Problem erscheint; Ich kann nicht Sprache verwenden [i] (oder so etwas wie das i-te Konstante der Sprachklasse wählen) zu hasLanguage zuzuweisen. Gibt es eine Möglichkeit i-te Konstante einer ENUM-Klasse zu wählen (wie refelections)? Würde jemand mir bitte in dieser Situation helfen?

War es hilfreich?

Lösung

Die Sprache der Klasse ist kein Enum in C # Terminologie. Es ist eine ganz normale Klasse mit öffentlichen const String-Felder. ROWLEX erzeugt absichtlich Enum-imitierende-Klassen statt nativen Aufzählungen aus 2 Gründen:

  1. Der Wert eines nativen C # Enum ist eine ganze Zahl, während ein public const String-Feld den URI der OWL-Klasseninstanz nehmen.
  2. Die Klasse kann eine zusätzliche öffentliche statische Zeichenfolge, die „URI“ ist, die die Klasse darstellt, URI konsequent für jeden einzelnen ROWLEX generierten Klasse.

Das war der Hintergrund. Wenn ich Ihre Frage richtig verstanden, Sie hatten ein Problem, um den ausgewählten Namen in der Dropdown-Liste zurück an den URI angezeigt Bindung, und man wollte die Position des Elements innerhalb des Arrays verwenden Sie erstellt. Ich würde es auf diese Weise nicht tun. Dropdownlists hat typischerweise sowohl ID und Wertfelder für jedes Listenelement (unterschiedlich Komponente zu Komponente genannt werden). Die ID wird erwartet, dass ein einzigartiges Objekt zu sein, während der Wert erwartet wird, etwas für Menschen lesbar enthalten. Stellen Sie die ID mit URI des „Enum“ Feld, und der Wert, wie Sie getan haben. Das ist also, wie Sie Ihre Drop-Down-bevölkern:

System.Reflection.FieldInfo[] resLanFields = typeof(Language).GetFields();
foreach(FieldInfo field in resLanFields)
{
  ListItem item = new ListItem();
  item.ID = field.GetValue(null); // takes the URI value of the const field
  item.Value = field.Name; // takes the name of the const field
  dropDownList_lang.AddItem(item);
}

Und wenn der Benutzer seine / ihre Wahl getroffen, das ist, wie Sie das Ergebnis auslesen:

learningResource.hasLanguage = (string) dropDownList_lang.SelectedItem.ID;

Da es impliziter Casting-Operator auf der ROWLEX Enum-imitierende-Klasse (string => Language) implementiert ist, können Sie sicher Ihr triple Subjekt als String gesetzt. Sollte ohne Frage kompilieren. Einfach ist es nicht?  ;)

Andere Tipps

Ich würde sagen,

resLanFields[i].GetValue(null)

aber wenn das funktioniert, mich nicht stimmen, ist dies ursprüngliche Antwort in Jons war.

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