2009-06-04 7 views
0

J'ai récemment évité un problème de cyclage entre les constantes d'une classe enum dans .net (créée à partir de ma classe OWL, par Rowlex OwlGrinder). Le problème a été résolu en utilisant .net reflexion (grâce à l'aide précieuse du cher Mr. Jon Skeet): stackoverflow:problem-cycling-enum-class-valuesProblème dans la sélection des constantes d'une classe enum

En résolvant cela, j'ai commencé à l'utiliser. Après avoir mis en correspondance une valeur sélectionnée dropDownList avec l'une des instances de la classe enum, j'ai dû déclarer l'objet sélectionné (= Language) à mon sujet RDF (= learningResource), via 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 Language [i] (ou quelque chose comme ça pour sélectionner la i-ème constante de la classe Language) pour l'assigner à hasLanguage. Existe-t-il un moyen de sélectionner la i-ème constante d'une classe enum (comme les refélections)? Quelqu'un pourrait-il m'aider dans cette situation?

+0

ce n'est pas une énumération, si je comprends la question originale. – Jimmy

+0

Peut-être pas appelé enum classe! mais je suis presque sûr de l'avoir vu quelque part quand on y travaille – Ehsan

Répondre

1

La classe Language n'est pas une énumération dans la terminologie C#. C'est une classe ordinaire avec des champs de chaîne publique const. 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 de classe de manière cohérente pour chaque classe ROWLEX générée.

C'était l'arrière-plan. Si j'ai bien compris votre question, vous avez eu un problème en reliant le nom sélectionné affiché dans la liste déroulante à l'URI, et vous vouliez utiliser la position de l'élément dans le tableau que vous avez créé. Je ne le ferais pas comme ça. DropDownLists ont généralement des champs ID et Value pour chaque élément de la liste (peut être nommé différemment composant en composant). L'ID est censé être un objet unique alors que la valeur devrait contenir quelque chose de lisible par l'homme. Définissez l'ID avec 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 ROWLEX enum-imitating-class (string => Language) vous permet de définir votre sujet triple en toute sécurité. Devrait compiler sans problème. Simple, n'est-ce pas? ;)

+0

Simple et utile. Je vous remercie – Ehsan

0

Je dirais que

resLanFields[i].GetValue(null) 

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

+0

Merci pour la réponse. Cela n'a pas fonctionné comme ça parce que "learningResource.hasLanguage" accepte simplement le type de "Language" qui lui est assigné. – Ehsan

Questions connexes