Pergunta

Eu encourted um problema recentemente sobre ciclismo entre constantes de uma classe enum em .net (que é criado de minha classe OWL, por Rowlex OwlGrinder). Problema foi resolvido por meio da utilização .net reflexão (graças à grande ajuda do caro Sr. Jon Skeet): stackoverflow: problema-ciclismo-ENUM classe valores

Ao resolver isso, eu comecei a usá-lo. Depois de combinar um valor selecionado DropDownList para uma das instâncias de classe enum, eu tinha que declarar o objeto selecionado (= Language) ao meu RDF assunto (= learningResource), através de um 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
        }

Agora, o problema parece; Eu não posso usar a linguagem [i] (ou algo assim para selecionar i-th constante de classe Language) para atribuir a hasLanguage. Existe uma maneira para selecionar i-th constante de uma classe enum (como refelections)? Será que alguém me ajudar por favor nesta situação?

Foi útil?

Solução

A classe A língua não é um enum em # terminologia C. É uma classe ordinária com campos const string público. ROWLEX gera intencionalmente ENUM imitando-classes em vez de enums nativas por 2 motivos:

  1. O valor de um C # enum nativo é um inteiro, enquanto um campo const string público pode tomar a URI da instância da classe OWL.
  2. A classe pode ter um public static string adicional que é "URI", que representa a classe URI consistente para cada ROWLEX classe gerada.

Essa foi a fundo. Se eu entendi a sua pergunta certa, você tinha uma ligação do nome selecionado questão exibida na parte traseira suspensa para o URI, e você queria usar a posição do elemento dentro da matriz que você criou. Eu não faria isso dessa maneira. DropDownLists normalmente têm tanto ID e campos de valor para cada item da lista (pode ser nomeado de forma diferente componente para componente). O ID é esperado para ser um objeto único, enquanto o valor é esperado para conter algo legível. Defina o ID com o URI do campo "enumeração", eo valor que você tenha feito. Então é assim que você preencher o seu suspensa:

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 o usuário fez o seu / sua escolha, isto é como você ler o resultado fora:

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

Uma vez que existe operador de conversão implícita implementada no enum-imitando classe ROWLEX (string => Language) é possível definir com segurança o assunto triple como uma string. Deve compilar sem problema. Simples, não é? ;)

Outras dicas

Eu diria

resLanFields[i].GetValue(null)

mas se isso funciona, não vote-me, isso foi em resposta original de Jon.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top