2009-06-04 82 views
0

我最近發現了一個問題,最近有關.NET中枚舉類的常量之間循環的問題(這是從我的OWL類創建的,由Rowlex OwlGrinder創建的)。通過使用.net反射(感謝親愛的Jon Skeet先生的大力幫助),問題得以解決: stackoverflow:problem-cycling-enum-class-values選擇枚舉類常量的問題

通過解決這個問題,我開始使用它。在將dropDownList選定值與其中一個枚舉類實例相匹配後,我必須通過謂詞(= hasLanguage)將選定對象(=語言)聲明給我的RDF主題(= learningResource)。

//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 
     } 

現在問題出現了;我不能使用語言[i](或類似的東西來選擇語言類的第i個常數)分配給hasLanguage。有沒有辦法選擇一個枚舉類的第i常數(如反思)? 有沒有人可以幫助我在這種情況下?

+0

這不是一個枚舉,如果我理解原來的問題。 – Jimmy 2009-06-04 00:11:25

+0

也許不叫枚舉類!但我幾乎可以肯定地看到它在工作時在什麼地方 – Ehsan 2009-06-04 00:34:40

回答

1

語言類不是C#術語中的枚舉。它是一個具有公共常量字符串字段的普通類。 ROWLEX故意生成枚舉模仿類,而不是天然的枚舉爲2個原因:

  1. 一個本地C#枚舉的值是一個整數,而公共常量字符串字段可以採取OWL類實例的URI。
  2. 該類可以有一個額外的公共靜態字符串,它是「URI」,它爲每個ROWLEX生成的類一致地表示類URI。

這是背景。如果我正確理解你的問題,你有一個問題將下拉列表中顯示的選定名稱綁定回URI,並且你想使用你創建的數組內的元素位置。我不會那樣做。對於每個列表項目,DropDownLists通常同時具有ID和值字段(可以以不同的組件命名)。預計該ID是一個獨特的對象,而該值預計包含人類可讀的內容。使用「enum」字段的URI和Value完成設置。因此,這是你如何填充您的下拉菜單:

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 enum-imitating-class(s​​tring => Language),你可以安全地將你的三元主題設置爲一個字符串。應該編譯沒有問題。簡單,不是嗎? ;)

+0

簡單而有幫助。謝謝 – Ehsan 2009-06-04 08:38:52

0

我想說

resLanFields[i].GetValue(null) 

但如果這個工程,不投給我,這是喬恩的原來的答案。

+0

感謝您的回答。它沒有那樣工作,因爲「learningResource.hasLanguage」只接受分配給它的「語言」類型。 – Ehsan 2009-06-04 00:27:38