Проблема выбора констант класса 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 причинам:

  1. Значение нативного перечисления C# является целым числом, в то время как открытое поле const может принимать URI экземпляра класса OWL.
  2. Класс может иметь одну дополнительную общедоступную статическую строку "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)

но если это сработает, не голосуйте за меня, это было в первоначальном ответе Джона.

Другие вопросы по тегам