Проблема выбора констант класса enum - PullRequest
0 голосов
/ 04 июня 2009

Недавно я обнаружил проблему, связанную с циклическим переключением между константами класса enum в .net (созданного из моего класса OWL Rowlex OwlGrinder). Проблема была решена с помощью отражения .net (благодаря огромной помощи дорогого мистера Джона Скита): StackOverflow: проблемно-циклотуризм перечисление класс-значение

Решив это, я начал его использовать. После сопоставления выбранного значения 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 ]

1 голос
/ 04 июня 2009

Класс 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) реализован оператор неявного приведения типов, вы можете смело устанавливать свой тройной субъект в виде строки. Должен компилироваться без проблем. Просто, не правда ли? ;)

0 голосов
/ 04 июня 2009

Я бы сказал

resLanFields[i].GetValue(null)

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

...