【问题标题】:Converting a string to a custom enum将字符串转换为自定义枚举
【发布时间】:2012-09-02 12:26:47
【问题描述】:

我试图通过查看保存在另一个对象中的字符串值来在自定义对象上设置自定义枚举属性,但我不断收到错误消息“无法通过表达式引用类型。”

到目前为止我已经尝试过

rec.Course  = (CourseEnum)Enum.Parse(typeof(CourseEnum), rr.course);

rec.Course 需要 CourseEnum 枚举的成员,而 rr.course 是一个字符串。

我还尝试做一个 switch 语句,检查 rr.course 的值(它只能是某些值)但得到相同的结果

枚举定义如下:

public enum CourseEnum
    {
        [StringValue("Starters")]
        Starters,
        [StringValue("Main Course")]
        MainCourse,
        [StringValue("Desserts")]
        Desserts
    };

public class StringValue : System.Attribute
{
    private string _value;

    public StringValue(string value)
    {
        _value = value;
    }

    public string Value
    {
        get { return _value; }
    }

}

public static class StringEnum
{
    public static string GetStringValue(Enum value)
    {
        string output = null;
        Type type = value.GetType();

        //Check first in our cached results...

        //Look for our 'StringValueAttribute' 

        //in the field's custom attributes

        FieldInfo fi = type.GetRuntimeField(value.ToString());
        StringValue[] attrs =
           fi.GetCustomAttributes(typeof(StringValue),
                                   false) as StringValue[];
        if (attrs.Length > 0)
        {
            output = attrs[0].Value;
        }

        return output;
    }
}

【问题讨论】:

  • 请不要混淆enum/枚举类型枚举器这两个术语(与IEnumerable/IEnumerable<T>接口相关) ,它指的是 C# 中两个非常不同的东西。
  • 你能把剩下的代码贴出来吗?代码rec.Courserr.course的定义是什么?
  • @O.R.Mapper 老实说我不确定,但谢谢你通知我
  • 您显示定义 recipeCourse 的位置的代码,但不显示定义 CourseEnum 的位置的代码。您能否显示该代码以及rr.course 的值是什么以及rec.Course 的定义位置。最有可能 Course 实际上被定义为枚举定义而不是包含枚举的字段。

标签: c# enums windows-8 microsoft-metro .net-4.5


【解决方案1】:

我可以在您的代码中看到您将 Enum.Parse 与 CourseEnum 一起使用,我想应该是 recipeCourse

我无法在您的示例代码中找到定义 4 CourseEnum 的任何地方。

【讨论】:

  • 如果你运行 OP 的代码,你可以看到它实际上得到了"Main Course" for recipeCourse.MainCourse
  • @L.B.:你能解释一下我提供的 sn-p 有什么问题吗?问题是关于将字符串转换为自定义枚举,这就是 sn-p 所做的。有什么我错过的吗?
  • 是的。问题不是“我该怎么做?”,问题是关于“不能通过表达式引用类型。”错误,答案很可能在这里@ 987654321@ 在之前的 cmets 中指出
  • @L.B.我查看了另一个 SO 问题,我的答案是将 OVType 的定义移到课堂之外(有些人已经建议了)。我在这里看不到同样的东西。
【解决方案2】:

@Hans Kesting 说,答案就在这里:Why can not reference a type through an expression?

问题在于使用具有枚举类型本身的枚举类型的字段。

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 2010-10-03
    • 1970-01-01
    • 2014-03-18
    • 2015-06-10
    • 1970-01-01
    • 2012-08-25
    • 2020-12-11
    相关资源
    最近更新 更多