选择枚举类的常量时出现问题

时间:2009-06-04 00:07:00

标签: c# rdf owl rowlex

我最近遇到了一个关于在.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)? 在这种情况下,有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

语言类不是C#术语中的枚举。它是一个带有公共const字符串字段的普通类。 ROWLEX故意生成枚举类而不是本机枚举,原因有两个:

  1. 本机C#enum的值是一个整数,而公共const字符串字段可以获取OWL类实例的URI。
  2. 该类可以有一个额外的公共静态字符串,即“URI”,它代表每个ROWLEX生成的类的一致的类URI。
  3. 那是背景。如果我理解你的问题是正确的,那么你有一个问题是将下拉列表中显示的选定名称绑定回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(s​​tring =&gt; Language)上实现了隐式转换运算符,因此您可以安全地将三重主题设置为字符串。应该编译没有问题。简单,不是吗?  ;)

答案 1 :(得分:0)

我会说

resLanFields[i].GetValue(null)

但如果这样做,请不要投票给我,这是Jon的原始答案。