65.9K
CodeProject 正在变化。 阅读更多。
Home

具有字符值项的 C# 枚举

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (9投票s)

2010 年 5 月 3 日

CPOL

3分钟阅读

viewsIcon

122505

如何将 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(),它会返回一个数字给我,为什么??

因为,实际上,你不能拥有一个带有关联 charEnum 项,但是 .NET 允许你这样做,并且在内部它会将你的 char 转换为其等效的 int 表示形式 (ASCII)。

所以,现在你在想,那又怎样? 我如何才能得到我的 char??
很简单,只需先将 Enum 项转换为 char,然后你就可以得到它的 char 表示形式

string type = ((char)StateEnum).ToString();  

这样,你可以从 int 中提取 char,并获得你的值!
这是为了将你的数据持久化到你的数据源(将 Enum 项转换为你的数据源所期望的值,即 char)。

但是现在,你需要将你的 char 转换为相应的 Enum 项,当你从你的数据源获取你的 char 字段时,对吗?
这怎么能做到呢?
好吧,我编写了一个方法来做到这一点,带有泛型,让我们看看

Pastebin 中的代码

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 项值(intchar)进行转换。

就是这样,你可以将 charEnum 对象一起使用,这不是很棒吗? 当我解决这个问题时,我只是想到了无数次我需要它的时候...

希望这能像帮助我一样帮助你。

关注点

关键的发现是从 enumchar 的转换,你需要首先将其转换为 char,然后你才能拥有你的 char 值,因为由于 .NET Framework 认为它是一个 int,你必须将其转换为 char(所以它将 int 转换为 ASCII 表中等效的 char,就像旧方法 chr())。

历史

  • 2010 年 5 月 3 日:首次发布
© . All rights reserved.