我最近遇到了一个关于在.net中枚举类的常量之间循环的问题(由我的OWL类创建,由Rowlex OwlGrinder创建)。通过使用.net反射解决了问题(感谢亲爱的Jon Skeet先生的大力帮助): stackoverflow:problem-cycling-enum-class-values
通过解决这个问题,我开始使用它。在将dropDownList选择的值与其中一个枚举类实例匹配之后,我必须通过谓词(= hasLanguage)将所选对象(= Language)声明为我的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
}
现在问题出现了;我不能使用Language [i](或类似的东西来选择语言类的第i个常量)来分配给hasLanguage。有没有办法选择枚举类的第i个常量(如refelections)? 在这种情况下,有人可以帮助我吗?
答案 0 :(得分:1)
语言类不是C#术语中的枚举。它是一个带有公共const字符串字段的普通类。 ROWLEX故意生成枚举类而不是本机枚举,原因有两个:
那是背景。如果我理解你的问题是正确的,那么你有一个问题是将下拉列表中显示的选定名称绑定回URI,并且你想在你创建的数组中使用元素的位置。我不这样做。 DropDownLists通常同时具有每个列表项的ID和值字段(可以不同的组件命名为组件)。 ID应该是一个唯一的对象,而Value应该包含人类可读的东西。使用“enum”字段的URI设置ID,并像您一样设置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(string =&gt; Language)上实现了隐式转换运算符,因此您可以安全地将三重主题设置为字符串。应该编译没有问题。简单,不是吗? ;)
答案 1 :(得分:0)
我会说
resLanFields[i].GetValue(null)
但如果这样做,请不要投票给我,这是Jon的原始答案。