Problema em constantes Seleção de uma classe enum
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?
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:
- 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.
- 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.