基本上我没有因某种原因收到正确的枚举类型,我无法弄清楚为什么,我的代码在下面,非常感谢任何提示/解释......
编辑: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
答案 0 :(得分:7)
枚举具有与TextArea
(Bool
和Choices
相同的基础值的重复成员。虽然解析应该成功,但是ToString
对结果枚举实例的值没有定义,并且可能不等于你的断言所期望的“TextArea”。
来自
Enum.ToString
文档:
如果有多个枚举成员 相同的潜在价值和你 尝试检索字符串 枚举的表示 会员的名字基于其底层 价值,你的代码不应该做任何 关于哪个名字的假设 方法将返回。
修改强>:
为了回应你的编辑,试试这个断言:
var MaxLength = EnumHelper.ToEnumSafe<anothername>("TextArea");
Assert.AreEqual(anotherName.TextArea, MaxLength);
或者如果您更喜欢比较基础类型:
Assert.AreEqual((int)anotherName.TextArea, (int)MaxLength);
如果枚举成员的值未明确指定 ,则您认为枚举成员未与基础值相关联。不是这种情况; 枚举的所有成员都与基础值相关联。 “隐含”关联的规则由(来自language specification):
给出•如果枚举成员是第一个枚举 在枚举类型中声明的成员,它的 相关值为零。
•否则, 枚举的关联值 成员是通过增加成员获得的 文本的相关值 前一个枚举成员。这个 增值必须在 可以的值范围 由底层类型表示, 否则会发生编译时错误。