代码之家  ›  专栏  ›  技术社区  ›  CodeLikeBeaker

枚举赋值解析c#

  •  1
  • CodeLikeBeaker  · 技术社区  · 16 年前

    public enum EFeedType
    {
        TypeOne = 1,
        TypeTwo = 2
    }
    

    现在,我将从数据库中获取数值。我需要将int值从DB转换为enum类型:

    编辑: 数据库类型是integer,所以我不需要从字符串强制转换。

    EFeedType feedType = (EFeedType) feedId;
    

    但是,当我执行此操作并传入值2时,我会得到以下错误:

    实例验证错误:“2”不是[Namespace Goes Here].EFeedType的有效值。

    有没有想过我可能做错了什么或错过了什么?

            //GetFeed will return an int value which is pulled from the database
            int feedId = new FeedEngine().GetFeed("FeedName");
            //Convert the ID to the Enum
            EFeedType feedType = (EFeedType) feedId;
            //Set the User Control FeedType Enum to the enum
            FeedControl.FeedType = feedType;
            //Show the user control
            FeedControl.Visible = true;
    

    编辑-更多信息

    好的,在看到JSkeet的响应之后,我看到如果我的feedId=1,那么它将把枚举值设置为TypeTwo,而不是它应该设置的TypeOne。也许我需要在我的枚举中使用一个默认值=0,这样才能工作?但必须有更好的方法,因为如果我的价值观不按顺序排列会怎么样呢。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Jon Skeet    16 年前

    你的错误 从你展示的那一行开始。我强烈怀疑它来自于这一行:

    FeedControl.FeedType = feedType;
    

    我的猜测是,该属性正在进行一些验证,并且它不知道相关的值。

    编辑:请注意,如果 Enum.IsDefined . Enum.Parse 对不正确的数值引发异常,只要它在正确的范围内。

    真正地 发布了枚举的确切代码?因为如果它没有显式指定“=1”和“=2”,它将从0开始自动递增,这将是您的问题。

        2
  •  0
  •   ChrisLively    16 年前

    我只是试了一下,效果非常好。您可能希望将代码分解成一个小测试项目,以查看发生了什么。

    // enum definition
        public enum EFeedType {
            TypeOne = 1,
            TypeTwo = 2,
        }
    
    // usage
            private void TestEnum() {
                Int32 feedId = 2;
                EFeedType stuff = (EFeedType)Enum.Parse(typeof(EFeedType), feedId.ToString());
                Response.Write(stuff.ToString());
            }