2009-06-04 4 views
0

Недавно я искал проблему цикличности между константами класса enum в .net (который создается из моего класса OWL, Rowlex OwlGrinder). Проблема была решена с помощью использования .net-рефлексии (благодаря большой помощи дорогого мистера Джона Скита): stackoverflow:problem-cycling-enum-class-valuesПроблема при выборе констант класса 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 (например, refelections)? Кто-нибудь, пожалуйста, помогите мне в этой ситуации?

+0

Это не переименование, если я понимаю исходный вопрос. – Jimmy

+0

Может быть, не называется enum class! но я почти наверняка видел его где-то, когда работаю на нем – Ehsan

ответ

1

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

  1. Ценности родного C#, перечисление является целым числом, тогда как поле строки публичного Const может взять URI экземпляра класса OWL.
  2. Класс может иметь одну дополнительную общедоступную статическую строку, которая является «URI», которая последовательно представляет собой URI класса для каждого отдельного генерируемого класса ROWLEX.

Это был фон. Если бы я правильно понял ваш вопрос, у вас возникла проблема с привязкой выбранного имени в раскрывающемся списке к URI, и вы хотели бы использовать позицию элемента внутри созданного массива. Я бы так не сделал. В DropDownLists обычно есть как поля ID, так и значения для каждого элемента списка (его можно назвать по-разному компонентом). Ожидается, что идентификатор будет уникальным объектом, в то время как ожидается, что значение будет содержать что-то читаемое человеком. Установите идентификатор с 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-подражательный класс (строка => Язык) вы можете безопасно установить свой трехместный объект в виде строки. Должен компилироваться без проблем. Простой, не так ли? ;)

+0

Простой и полезный. спасибо – Ehsan

0

Я бы сказал, что

resLanFields[i].GetValue(null) 

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

+0

Спасибо за ответ. Это не сработало, потому что «learningResource.hasLanguage» просто принимает тип «Язык», назначающий его. – Ehsan