Domanda

Ho encourted un problema da poco sul ciclismo tra le costanti di una classe enum in .net (che viene creato dalla mia classe OWL, da Rowlex OwlGrinder). Problema è stato risolto mediante utilizzando .net riflessione (grazie al grande aiuto dal caro signor Jon Skeet): StackOverflow:-enum-class-valori-problema di ciclismo

Per la soluzione di questo, ho iniziato ad usarlo. Dopo aver fatto corrispondere un DropDownList valore selezionato per una delle istanze di classe enum, ho dovuto dichiarare l'oggetto selezionato (= linguaggio) alla mia RDF soggetto (= learningResource), tramite un predicato (= 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
        }

Ora il problema appare; Non posso usare un linguaggio [i] (o qualcosa di simile per selezionare i-esimo costante di classe di lingua) da assegnare al hasLanguage. C'è un modo per selezionare i-esimo costante di una classe enum (come refelections)? Sarebbe uno please help me in questa situazione?

È stato utile?

Soluzione

La classe di linguaggio non è un enum in C # terminologia. Si tratta di una classe ordinaria con campi stringa const pubblico. ROWLEX genera intenzionalmente enum-imitando-classi invece di enumerazioni native per 2 motivi:

  1. Il valore di un C # enum nativo è un numero intero, mentre un campo di stringa const pubblico può prendere l'URI l'istanza della classe OWL.
  2. La classe può avere una stringa statica pubblica aggiuntiva che è "URI", che rappresenta la classe URI in modo coerente per ogni singola classe generata ROWLEX.

Questo è stato lo sfondo. Se ho capito la tua domanda giusta, hai avuto un problema vincolante il nome selezionato visualizzato nel menu a discesa di nuovo alla URI, e di voler utilizzare la posizione dell'elemento all'interno della matrice si è creato. Io non lo farei in questo modo. DropDownList in genere hanno sia campi di valore per ogni elemento dell'elenco ID e (può essere chiamato in modo diverso componente per componente). L'ID dovrebbe essere un oggetto unico, mentre il valore è previsto per contenere qualcosa leggibile. Impostare l'ID con URI del campo "enum", e il valore come avete fatto. Quindi questo è il modo per popolare il menu a discesa:

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

E quando l'utente ha fatto il suo / la sua scelta, questo è il modo di leggere il risultato out:

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

Poiché non v'è implicita operatore di colata implementato sul ROWLEX enum-imitazione-class (stringa => Lingua) È possibile impostare in modo sicuro il soggetto tripla come una stringa. Dovrebbe compilare senza problema. Semplice, non è vero?  ;)

Altri suggerimenti

Direi

resLanFields[i].GetValue(null)

, ma se questo funziona, non votare me up, questo era in risposta originale di Jon.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top