Проблема с выбором констант класса enum

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

Решив это, я начал его использовать. После сопоставления выбранного значения dropDownList с одним из экземпляров класса enum мне пришлось объявить выбранный объект (= Language) моему субъекту 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-ю константу класса перечисления (например, рефлексы)? Кто-нибудь, пожалуйста, поможет мне в этой ситуации?


person Ehsan    schedule 04.06.2009    source источник
comment
это не перечисление, если я понимаю исходный вопрос.   -  person Jimmy    schedule 04.06.2009
comment
Может быть, это не класс enum! но я почти уверен, что видел это где-то, когда работал над этим   -  person Ehsan    schedule 04.06.2009


Ответы (2)


Класс Language не является перечислением в терминологии C #. Это обычный класс с общедоступными строковыми константными полями. ROWLEX намеренно создает классы, имитирующие перечисление, вместо собственных перечислений по двум причинам:

  1. Значение собственного перечисления C # является целым числом, в то время как поле общедоступной константной строки может принимать 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;

Поскольку в классе-имитации перечисления ROWLEX реализован оператор неявного приведения (string => Language), вы можете безопасно установить тройную тему в виде строки. Должен скомпилироваться без проблем. Просто, не правда ли? ;)

person ROWLEX Admin    schedule 04.06.2009
comment
Просто и полезно. Спасибо - person Ehsan; 04.06.2009

я бы сказал

resLanFields[i].GetValue(null)

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

person Jimmy    schedule 04.06.2009
comment
Спасибо за ответ. Это не сработало, потому что learningResource.hasLanguage просто принимает тип назначаемого ему языка. - person Ehsan; 04.06.2009