在.NET中,枚举一般有两种常见用法,一是表示唯一的元素序列,比如表示订单状态(未提交,待处理,处理中...)。另外一种是表示多种组合的状态,比如表示权限,因为可同时有多个不同权限。

基本用法

这里拿项止中订单的订单状态来举例。

1,使用枚举表示订单的订单状态,并保存到数据库

public void SaveOrder()
{
using (var db = new HotelDBEntities())
{
var order = new EFHotelOrder
{
OrderID = 10000,
OrderStatus = (byte)OrderStatusType.NotSubmit//订单状态
};
db.HotelOrderSet.Add(order);
db.SaveChanges();
}
}
/// <summary>
/// 訂單狀態
/// </summary>
[DataContract, Serializable]
public enum OrderStatusType : byte
{
/// <summary>
/// 未提交
/// </summary>
[Description("未提交")]
[EnumMember]
NotSubmit = 0, /// <summary>
/// 待處理
/// </summary>
[Description("待處理")]
[EnumMember]
WaitingProcess = 1, /// <summary>
/// 處理中
/// </summary>
[Description("處理中")]
[EnumMember]
Processing = 2, /// <summary>
/// 預訂成功
/// </summary>
[Description("預訂成功")]
[EnumMember]
BookingSuccess = 3
}

2,从数据库读取订单状态,并转化成相应枚举

var orderStatus= order.OrderStatus.ToEnum<LocalHotelOrderStatusType>();//ToEnum是扩展方法

高级用法

为了说明表示多种组合状态,拿用户拥有的权限来说明。此时需要在枚举上加[Flags]特性来标记位域。

1,枚举的定义

/// <summary>
/// 权限枚举
/// </summary>
[Flags]
[DataContract, Serializable]
public enum Permission : int
{
//[Description("未知")]
[EnumMember]
Unknown = 0,//也可以写成0x00或0 //[Description("创建")]
[EnumMember]
Create = 1 << 0,//0x01或1 //[Description("读取")]
[EnumMember]
Read = 1 << 1,//0x02或2 //[Description("修改")]
[EnumMember]
Update = 1 << 2,//0x04或4 //[Description("删除")]
[EnumMember]
Delete = 1 << 3//0x08或8
}

注意加了[Flags]特性后有三种写法,一种是使用<<符号,第二种是0x01,还有一种是直接写0,1,2,4,8...,一般来说是2的n次方来表示。

2,使用

//1,给用户创建,读取,修改和删除的权限
var permission = Permission.Create | Permission.Read | Permission.Update | Permission.Delete; //2,去掉用户的修改和删除权限
permission = permission & ~Permission.Update;//permission = permission ^ Permission.Update;这种写法有bug,如果重复执行又加回去了
permission = permission & ~Permission.Delete; //3,给用户加上修改的权限
permission = permission | Permission.Update; //4,判断用户是否有创建的权限
var isCreate = (permission & Permission.Create) != 0;//或者var isCreate =(permission & Permission.Create)== Permission.Create

保存到数据库的时候转换成int类型保存。

在数据库中可以这样来判断:

AND (@permission IS NULL OR (permission & @permission) =@permission)

项目中Enum枚举的使用的更多相关文章

  1. Java中Enum枚举的使用

    三种不同的用法 注意项: 1.在switch中使用枚举能使代码的可读性更强.   2.如果要自定义方法,那么必须在enum实例序列的最后添加分号.而且Java要求必须先定义enum实例.   3.所有 ...

  2. java 中 enum 枚举的使用

    package test3; public final class Program {    public static void main(String[] args) {       // Sys ...

  3. 浅谈 Java 中的枚举

    枚举也就是一一列举,常用来表示那些可以明确范围的集合,比方说性别,季节,星期,月份等. 在 JDK 1.5 才出现枚举类,在没有出现枚举类之前,我们要表示几个确定的值通常会使用常量来表示,形如 pub ...

  4. Java enum枚举在实际项目中的常用方法

    在项目实际开发过程中,经常会遇到对某些固定的值.字典项的定义的需求,很多项目经常使用常量来定义,其实在jdk1.5就已经引入了枚举,使用枚举可以更好的解决这类需求,本文主要记录枚举的优势以及经常在项目 ...

  5. MVC3不能正确识别JSON中的Enum枚举值

    一.背景 在MVC3项目里,如果Action的参数中有Enum枚举作为对象属性的话,使用POST方法提交过来的JSON数据中的枚举值却无法正确被识别对应的枚举值. 二.Demo演示 为了说明问题,我使 ...

  6. C# 枚举在项目中使用心得

    阅读目录 基本介绍 使用注意 使用方法 扩展用法     本文主要是我在项目中对C#枚举的使用心得,如有不足的地方欢迎您指出. 一.基本介绍  枚举是由一组特定常量构成的一组数据结构,是值类型的一种特 ...

  7. C#中的枚举(Enum)你知道多少呢?

    写个随笔文章是最难想的,我要是写个C#枚举个人小结,估计博客园的各位园有也觉得是哪个刚接触C#的人写的,要是取个名字叫C#枚举,又觉得不能完全表达自己的意思,现在这个名字看起来还凑合吧,写篇文章不容易 ...

  8. Android 中如何使用 enum / 枚举

    如何在Android开发中合理的使用enum 欢迎大家访问我的Github开源库,这里有好玩的App源码,想和大家分享.https://github.com/ChoicesWang 转载请注明:htt ...

  9. .NET中的枚举(Enum)

    摘要:.NET中的枚举分为简单枚举和标志枚举,这次主要总结一下标志枚举适用条件,以及它的使用方法,并在文章的最后列举枚举使用的一些规范. 在刚接触.NET的枚举时,只用简单的枚举,对于标记枚举,只知道 ...

随机推荐

  1. 转 cocos2d-x 优化(纹理渲染优化、资源缓存、内存优化)

    概述 包括以下5种优化:引擎底层优化.纹理优化.渲染优化.资源缓存.内存优化   引擎优化 2.0版本比1.0版本在算法上有所优化,效率更高.2.0版本使用OpenGl ES 2.0图形库,1.0版本 ...

  2. 关于js的兼容问题(小办法)!

    今天整理了一下浏览器对JS的兼容问题,希望能给你们带来帮助,我没想到的地方请留言给我,我再加上: 常遇到的关于浏览器的宽高问题: //以下均可console.log()实验 var winW=docu ...

  3. hdu 5339 Untitled

    这题很明显是签到题,可我比赛时却没做出,赤裸裸的爆零了,真悲剧…… 看了题解后才知道直接暴搜就行,只是需要把它们从大到小排序后再搜,我当时就没想到...不想再多说了 一开始我直接枚举所有情况: #in ...

  4. HBase集群搭建

    HBase集群搭建 搭建环境:假设我们的linux环境已经准备好,包括网络.JDK.防火墙.主机名.免密登录等都没有问题,而且一定要有zookeeper.下面我们用3台linux虚拟机来搭建Hbase ...

  5. 转!!Java垃圾回收机制

    1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...

  6. LTIB常用命令2

    LTIB 编译配置选项 根据说明文档,ltib 可以通过以下的命令配置: * <verbatim># ./ltib</verbatim>          安装后第一次运行,采 ...

  7. iOS开发 设置状态栏样式

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:NO];

  8. 向java全台推送数据等

    (1)http://www.cnblogs.com/xdp-gacl/p/3789624.html (2)VenusWebHelper  等等 public void test(){ String f ...

  9. 大S《美容大王》内容80%都是没用的东西

    揭20位明星真实人品 我在她大陆的企划公司工作过,见过她N次了,对人态度蛮不错的,而且很爱开玩笑,但感觉很假很抠门.只要一回公司她就黏着请她吃饭.她很主动很霸道,她和周渝民交往,原因之一就是周什么都听 ...

  10. 在应用中更新App版本

    在应用中, 为了提高用户体验, 会提供更新版本的功能. 那么如何实现呢? 我写了一个简单的Demo, 说明一下, 需要注意几个细节. 使用了Retrofit和Rx处理网络请求. Github下载地址 ...