基本上我没有收到正确的enum类型出于某种原因,我不知道为什么,我的代码如下,非常感谢提前任何指针/解释…
EDIT: 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值,我得到不正确的结果…
枚举有与TextArea
(Bool
和Choices
)具有相同底层值的重复成员。虽然解析应该成功,但是结果枚举实例上的ToString
的值没有定义,并且可能不等于断言所期望的"TextArea"。
的 Enum.ToString
documentation:
如果多个枚举成员有同样的潜在价值和你尝试检索字符串枚举的表示形式基于其底层的成员名称值时,您的代码不应该生成任何值关于哪个名称的假设方法将返回。
编辑:
作为对您编辑的回应,请尝试以下断言:
var MaxLength = EnumHelper.ToEnumSafe<anothername>("TextArea");
Assert.AreEqual(anotherName.TextArea, MaxLength);
或者如果你想比较底层类型:
Assert.AreEqual((int)anotherName.TextArea, (int)MaxLength);
如果枚举成员的值没有显式地指定,那么它似乎与基础值没有关联。事实并非如此;枚举的所有成员都与一个基础值相关联。"隐式"关联的规则由(来自语言规范)给出:
•如果枚举成员是第一个枚举在枚举类型中声明的成员关联值为零。
•否则,enum的关联值成员是通过增加的关联值前一个枚举成员编号为1。这增加值必须在值的范围由基础类型表示,否则会出现编译时错误。