我最近遇到了一个关于 .net 中枚举类常量之间循环的问题(该类是由 Rowlex OwlGrinder 从我的 OWL 类创建的)。通过使用.net反射解决了问题(感谢亲爱的Mr.的大力帮助)乔恩·斯基特):stackoverflow:问题循环枚举类值

通过解决这个问题,我开始使用它。将 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 个常量(如反射)?在这种情况下有人可以帮助我吗?

有帮助吗?

解决方案

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

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

这就是背景。如果我正确理解您的问题,则您在将下拉列表中显示的选定名称绑定回 URI 时遇到问题,并且您想要使用您创建的数组内元素的位置。我不会那样做。DropDownList 通常对每个列表项都有 ID 和 Value 字段(可以对组件进行不同的命名)。ID 应该是唯一的对象,而 Value 应该包含人类可读的内容。设置带有“enum”字段的 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) 上实现了隐式转换运算符,因此您可以安全地将三重主题设置为字符串。应该编译没有问题。很简单,不是吗?;)

其他提示

我说

resLanFields[i].GetValue(null)

但如果这个工程,不投给我,这是乔恩的原来的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top