具有字符值项的 C# 枚举





3.00/5 (9投票s)
如何将 char 用作枚举项的值,以及为什么
引言
专注于主题,我将要写关于 Enum
类型的什么呢?
- 我们可以将
Enum
项赋值给任何不是int
类型的东西吗? - 我为什么要费心思考这个问题?
- 我如何处理将某些东西转换为
Enum
以及将它转换回某些东西?
背景
这一切都始于我有一个带有 char
的数据库字段,并且需要在我的 C# 代码中使用强类型的方式来处理它,然后我想通了,这是可能的。
Using the Code
首先,是的,我们可以将 Enum
赋值给其他东西,一个 char
!
怎么做?
就像你正在思考的那样,是的
public Enum myEnum
{
value1 = 'a',
value2 = 'b'
}
我为什么要考虑这个?
你是否曾经需要编写一些 DAL 代码或将现有数据库映射到 ORM,例如 Entity Framework,并且你有一些字段包含,由于某些特定原因,一个受控的 char
列表,它们与任何其他表无关,例如一个名为 State
的字段,它具有可能的值,'R
' 代表 Ready
,'P
' 代表 Pending
和 'C
' 代表 Cancelled
,并且你希望有一种很好且类型安全的方法来在代码中操作该字段,同时也是一种通用的方法,可以在任何地方使用,那么,你可以使用 Enum
类型中的那些 char
来做到这一点
public Enum State
{
Ready = 'R',
Pending = 'P',
Cancelled = 'C'
}
我该如何处理这个问题? 我肯定会尝试执行 State.ToString()
,它会返回一个数字给我,为什么??
因为,实际上,你不能拥有一个带有关联 char
的 Enum
项,但是 .NET 允许你这样做,并且在内部它会将你的 char
转换为其等效的 int
表示形式 (ASCII)。
所以,现在你在想,那又怎样? 我如何才能得到我的 char
??
很简单,只需先将 Enum
项转换为 char
,然后你就可以得到它的 char
表示形式
string type = ((char)StateEnum).ToString();
这样,你可以从 int
中提取 char
,并获得你的值!
这是为了将你的数据持久化到你的数据源(将 Enum
项转换为你的数据源所期望的值,即 char
)。
但是现在,你需要将你的 char
转换为相应的 Enum
项,当你从你的数据源获取你的 char
字段时,对吗?
这怎么能做到呢?
好吧,我编写了一个方法来做到这一点,带有泛型,让我们看看
public static T ToEnum< T >(string @string)
{
if (string.IsNullOrEmpty(@string))
{
throw new ArgumentException("Argument null or empty");
}
if (@string.Length > 1)
{
throw new ArgumentException("Argument length greater than one");
}
return (T)Enum.ToObject(typeof(T), @string[0]);
}
所以你在这里所做的是接受一个 string
(可以是 char
,只是为了简化它,因为许多 ORM 将数据库中的 char
映射到 string
,而不是 char
),然后你检查你的参数,如果它们不是 null
,并且如果 string
的长度为 1(这与 char
匹配),然后,你使用 Enum
类型的 ToObject
方法,它接受你想要获得的返回类型,以及相应的 Enum
项值(int
或 char
)进行转换。
就是这样,你可以将 char
与 Enum
对象一起使用,这不是很棒吗? 当我解决这个问题时,我只是想到了无数次我需要它的时候...
希望这能像帮助我一样帮助你。
关注点
关键的发现是从 enum
到 char
的转换,你需要首先将其转换为 char
,然后你才能拥有你的 char
值,因为由于 .NET Framework 认为它是一个 int
,你必须将其转换为 char
(所以它将 int
转换为 ASCII 表中等效的 char
,就像旧方法 chr()
)。
历史
- 2010 年 5 月 3 日:首次发布