Проблема при выборе констант класса enum
Вопрос
Недавно я столкнулся с проблемой, связанной с циклическим переключением между константами класса enum в .net (который создан на основе моего класса OWL с помощью Rowlex OwlGrinder).Проблема была решена с помощью .net reflection (благодаря большой помощи от уважаемого Mr.Джон Скит):stackoverflow: проблема-циклирование-перечисление-значений класса
Решив эту проблему, я начал ее использовать.После сопоставления выбранного значения из выпадающего списка с одним из экземпляров класса enum мне пришлось объявить выбранный объект (= Язык) моему субъекту RDF(=learningResource) через предикат (=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
}
Теперь появляется проблема;Я не могу использовать Language [i] (или что-то подобное для выбора i-й константы языкового класса) для присвоения hasLanguage.Есть ли способ выбрать i-ю константу класса enum (например, refelections)?Не мог бы кто-нибудь, пожалуйста, помочь мне в этой ситуации?
Решение
Языковой класс не является перечислением в терминологии C #.Это обычный класс с общедоступными строковыми полями const.ROWLEX намеренно генерирует классы, имитирующие перечисления, вместо собственных перечислений по двум причинам:
- Значение собственного перечисления C # является целым числом, в то время как общедоступное поле const string может принимать URI экземпляра класса OWL.
- Класс может иметь одну дополнительную общедоступную статическую строку, которая является "URI", которая последовательно представляет URI класса для каждого отдельного класса, сгенерированного ROWLEX.
Это была предыстория.Если я правильно понял ваш вопрос, у вас возникла проблема с привязкой выбранного имени, отображаемого в выпадающем списке, обратно к URI, и вы хотели использовать позицию элемента внутри созданного вами массива.Я бы не стал делать это таким образом.Выпадающие списки обычно содержат поля идентификатора и значения для каждого элемента списка (могут называться по-разному в зависимости от компонента).Ожидается, что идентификатор будет уникальным объектом, в то время как ожидается, что Значение будет содержать что-то понятное человеку.Задайте идентификатор с помощью URI поля "enum" и значение, как вы уже сделали.Итак, вот как вы заполняете свой выпадающий список:
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);
}
И когда пользователь сделал свой выбор, вот как вы зачитываете результат:
learningResource.hasLanguage = (string) dropDownList_lang.SelectedItem.ID;
Поскольку в классе, имитирующем перечисление ROWLEX, реализован оператор неявного приведения (string=>Language), вы можете безопасно задать свой тройной объект в виде строки.Должна скомпилироваться без проблем.Просто, не правда ли?;)
Другие советы
Я бы сказал
resLanFields[i].GetValue(null)
но если это сработает, не голосуйте за меня, это было в первоначальном ответе Джона.