c#中的枚举助手没有给出预期的结果

时间:2011-04-15 14:58:44

标签: c# .net-3.5 enums

基本上我没有因某种原因收到正确的枚举类型,我无法弄清楚为什么,我的代码在下面,非常感谢任何提示/解释......

编辑:type->改成了另一个名字(感谢大家的提名)

助手:

 public static T Convert<T>(this string str)
    {
        return (T)Enum.Parse(typeof(T), str, true);
    }

枚举值:

public enum anothername
    {
        SmallText = 100,
        Number = 15,
        TextArea = 0,
        Bool = 0,
        Choices = 0,
    }

我的测试:

 [Test]
        public void EnumGetStringFromEnumType()
        {
            //arrange
            var MaxLength = EnumHelper.Convert<anothername>("TextArea").ToString();

            //act

            //assert
            Assert.AreEqual("TextArea", MaxLength);


        }

编辑:

谢谢,删除int值解决了它!

然而......如果我真的想要说某些枚举类型的值而不是其他类型的话会怎么样。

public enum anothername
    {
        SmallText = 100,
        Number = 15,
        TextArea,
        Bool,
        Choices,
    }

测试2:

[Test]
        public void EnumGetIntValueOrStringFromEnumType()
        {
            //arrange
            var MaxLength = EnumHelper.ToEnumSafe<anothername>("TextArea");

            //act

            //assert
            Assert.AreEqual(null, (int)MaxLength);

        }

当我尝试检索int值时,我遇到了完全相同的问题,结果不正确... 结果= 16

1 个答案:

答案 0 :(得分:7)

枚举具有与TextAreaBoolChoices相同的基础值的重复成员。虽然解析应该成功,但是ToString对结果枚举实例的值没有定义,并且可能不等于你的断言所期望的“TextArea”。

来自 Enum.ToString文档:

  

如果有多个枚举成员   相同的潜在价值和你   尝试检索字符串   枚举的表示   会员的名字基于其底层   价值,你的代码不应该做任何   关于哪个名字的假设   方法将返回。

修改

为了回应你的编辑,试试这个断言:

var MaxLength = EnumHelper.ToEnumSafe<anothername>("TextArea");
Assert.AreEqual(anotherName.TextArea, MaxLength);

或者如果您更喜欢比较基础类型:

Assert.AreEqual((int)anotherName.TextArea, (int)MaxLength);

如果枚举成员的值未明确指定 ,则您认为枚举成员未与基础值相关联。不是这种情况; 枚举的所有成员都与基础值相关联。 “隐含”关联的规则由(来自language specification):

给出
  

•如果枚举成员是第一个枚举   在枚举类型中声明的成员,它的   相关值为零。

     

•否则,   枚举的关联值   成员是通过增加成员获得的   文本的相关值   前一个枚举成员。这个   增值必须在   可以的值范围   由底层类型表示,   否则会发生编译时错误。