Проблема выбора констант класса enum
Недавно я обнаружил проблему с циклическим переключением между константами класса enum в.net (созданного из моего класса OWL Rowlex OwlGrinder). Проблема была решена с помощью отражения.net (благодаря огромной помощи уважаемого г-на Джона Скита): /questions/14602795/problema-zatsiklivaniya-znachenij-klassa-enum
Решив это, я начал его использовать. После сопоставления выбранного значения dropDownList с одним из экземпляров класса 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-й константы класса Language) для присвоения hasLanguage. Есть ли способ выбрать i-ую константу класса enum (например, ссылки)? Кто-нибудь, пожалуйста, помогите мне в этой ситуации?
2 ответа
Класс Language не является перечислением в терминологии C#. Это обычный класс с открытыми строковыми полями const. ROWLEX намеренно генерирует имитирующие перечисление классы вместо собственных перечислений по 2 причинам:
- Значение нативного перечисления C# является целым числом, в то время как открытое поле const может принимать URI экземпляра класса OWL.
- Класс может иметь одну дополнительную общедоступную статическую строку "URI", которая последовательно представляет URI класса для каждого сгенерированного класса ROWLEX.
Это был фон. Если я правильно понял ваш вопрос, у вас возникла проблема, связывающая выбранное имя, отображаемое в раскрывающемся списке, с URI, и вы хотели использовать положение элемента внутри созданного вами массива. Я бы так не поступил. DropDownLists обычно имеют поля ID и Value для каждого элемента списка (могут называться по-разному в зависимости от компонента). Ожидается, что идентификатор будет уникальным объектом, в то время как значение будет содержать что-то удобочитаемое для человека. Установите идентификатор с 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;
Поскольку в классе enow-imitating класса ROWLEX (string=>Language) реализован оператор неявного приведения типов, вы можете смело устанавливать свой тройной субъект в виде строки. Должен компилироваться без проблем. Просто, не правда ли?;)
Я бы сказал
resLanFields[i].GetValue(null)
но если это сработает, не голосуйте за меня, это было в первоначальном ответе Джона.