0

我最近遇到了一个关于在 .net 中枚举类的常量之间循环的问题(由 Rowlex OwlGrinder 从我的 OWL 类创建)。通过使用 .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](或类似的东西来选择 Language 类的第 i 个常量)分配给 hasLanguage。有没有办法选择枚举类的第 i 个常量(如引用)?在这种情况下有人可以帮助我吗?

4

2 回答 2

1

Language 类不是 C# 术语中的枚举。它是一个具有公共 const 字符串字段的普通类。ROWLEX 有意生成枚举模仿类而不是原生枚举,原因有两个:

  1. 原生 C# 枚举的值是整数,而公共 const 字符串字段可以采用 OWL 类实例的 URI。
  2. 该类可以有一个额外的公共静态字符串,即“URI”,它一致地表示每个 ROWLEX 生成的类的类 URI。

这就是背景。如果我正确理解了您的问题,那么您在将下拉列表中显示的选定名称绑定回 URI 时遇到问题,并且您想使用您创建的数组中元素的位置。我不会那样做。DropDownLists 通常具有每个列表项的 ID 和 Value 字段(可以以不同的组件命名)。ID 应该是唯一的对象,而 Value 应该包含人类可读的内容。使用“枚举”字段的 URI 设置 ID,并按照您所做的那样设置值。这就是您填充下拉列表的方式:

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) 上实现了隐式转换运算符,您可以安全地将三重主题设置为字符串。应该编译没有问题。很简单,不是吗?;)

于 2009-06-04T07:19:37.217 回答
0

我会说

resLanFields[i].GetValue(null)

但如果这可行,请不要投票给我,这是乔恩的原始答案。

于 2009-06-04T00:14:01.343 回答