Question

J'ai encourted un problème récemment sur le cyclisme entre les constantes d'une classe d'ENUM en .net (créé à partir de ma classe OWL, par Rowlex OwlGrinder). Problème a été résolu par l'utilisation de la réflexion .net (grâce à l'aide précieuse de M. cher Jon Skeet): stackoverflow: problème-cyclisme-ENUM classe valeurs

En résolvant, je commencé à l'utiliser. Après avoir établi une DROPDOWNLIST valeur sélectionnée à l'une des instances de classe enum, je devais déclarer l'objet sélectionné (= langue) à mon sujet RDF (= learningResource), par l'intermédiaire d'un prédicat (= hasLanguage).

//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
        }

Maintenant, le problème apparaît; Je ne peux pas utiliser la langue [i] (ou quelque chose comme ça pour sélectionner i-ième constante de la classe de langue) pour attribuer à hasLanguage. Est-il possible de sélectionner constante i-ème d'une classe d'ENUM (comme refelections)? Est-ce que l'une s'il vous plaît me aider dans cette situation?

Était-ce utile?

La solution

La classe de langue n'est pas une ENUM en C # terminologie. Il est une classe ordinaire avec des champs de chaîne de const public. ROWLEX génère intentionnellement ENUM imitatrices classes au lieu de énumérations indigènes pour 2 raisons:

  1. La valeur d'un ENUM natif C # est un entier, tandis qu'un champ de chaîne de const public peut prendre l'URI de l'instance de la classe OWL.
  2. La classe peut avoir une chaîne statique publique supplémentaire qui est « URI » qui représente l'URI classe systématiquement pour chaque classe générée par ROWLEX.

C'était l'arrière-plan. Si je comprends bien votre question à droite, vous avez eu un problème liant le nom sélectionné affiché dans le menu déroulant Retour à l'URI, et que vous vouliez utiliser la position de l'élément à l'intérieur du tableau que vous avez créé. Je ne le ferais pas de cette façon. DropDownLists ont généralement deux champs ID et valeur pour chaque élément de la liste (peut être nommé différemment composant au composant). L'ID devrait être un objet unique alors que la valeur devrait contenir quelque chose lisible par l'homme. Définissez l'ID avec l'URI du champ « ENUM », et la valeur que vous avez fait. Voilà donc comment vous remplissez votre menu déroulant:

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);
}

Et lorsque l'utilisateur a fait son / son choix, voici comment vous lisez le résultat sur:

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

Comme il est opérateur de coulée implicite mis en œuvre sur le ENUM-classe ROWLEX imitant (string => Langue) vous pouvez en toute sécurité mis votre sujet triple comme une chaîne. Devrait compiler sans problème. Simple, non?  ;)

Autres conseils

Je dirais

resLanFields[i].GetValue(null)

mais si cela fonctionne, ne me vote pas, ce fut en réponse originale de Jon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top