Pregunta

He encourted un problema recientemente acerca de un ciclo entre las constantes de una clase de enumeración en .NET (que se crea de mi clase OWL, por Rowlex OwlGrinder). Problema se resuelve por medio de la reflexión utilizando .NET (gracias a la gran ayuda de querido Sr. Jon Skeet): stackoverflow: enum-clase-valores problema-ciclismo

Al resolver esto, empecé a usarlo. Después de hacer coincidir un valor seleccionado DropDownList a una de las instancias de la clase enum, tenía que declarar el objeto seleccionado (= Idioma) a mi RDF sujeto (= learningResource), a través de un predicado (= 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
        }

Ahora aparece el problema; No puedo usar lenguaje [i] (o algo similar para seleccionar i-ésima constante de la clase de idiomas) para asignar a hasLanguage. ¿Hay una manera de seleccionar i-ésima constante de una clase de enumeración (como refelections)? Sería cualquiera, por favor me ayude en esta situación?

¿Fue útil?

Solución

La clase de lenguaje no es una enumeración en C # terminología. Es una clase ordinaria con los campos de cadena Public Const. ROWLEX genera intencionadamente enum-imitando-clases en lugar de enumeraciones nativas por 2 razones:

  1. El valor de un nativo de C # enumeración es un entero, mientras que un campo de cadena const público puede tomar la URI de la instancia de clase OWL.
  2. La clase puede tener una cadena estática pública adicional que es "URI", que representa la clase URI consistente para cada clase generada sola ROWLEX.

Ese fue el fondo. Si he entendido su pregunta correcta, que tenía un problema vinculante el nombre seleccionado aparece en el menú desplegable de nuevo a la URI, y que quería utilizar la posición del elemento dentro de la matriz que ha creado. Yo no lo haría de esa manera. DropDownLists suelen tener tanto campos de valor para cada elemento de la lista de ID y (puede ser identificado de manera diferente componente a componente). Se espera que el ID de ser un objeto único, mientras que se espera que el valor de contener algo legible. Establecer el ID de la URI del campo "enumeración", y el Valor como lo han hecho. Así que esta es la forma de rellenar el desplegable:

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

Y cuando el usuario hizo su / su elección, así es como se lee el resultado fuera:

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

Dado que no es operador de conversión implícita implementado en la enumeración que imita clase ROWLEX (cadena => Idioma) se puede establecer con seguridad el sujeto de triple como una cadena. Debe compilar sin problemas. Simple, ¿verdad?  ;)

Otros consejos

Yo diría

resLanFields[i].GetValue(null)

pero si esto funciona, no me votar hasta, esto fue en respuesta original de Jon.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top