Вопрос

Недавно я столкнулся с проблемой, связанной с циклическим переключением между константами класса 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 намеренно генерирует классы, имитирующие перечисления, вместо собственных перечислений по двум причинам:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top