项目中Enum枚举的使用

在.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是扩展方法

ToEnum的扩展:

 1 public static T ToEnum<T>(this byte value, T defaultValue) where T : struct, IComparable, IConvertible, IFormattable {
 2             var type = typeof(T);
 3             if (!type.IsEnum)
 4                 throw new Exception("T 必须是枚举类型");
 5
 6             if (Enum.IsDefined(type, value)) {
 7                 return (T)Enum.ToObject(type, value);
 8             } else {
 9                 return defaultValue;
10             }
11         }
12
13         /// <summary>
14         ///
15         /// </summary>
16         /// <typeparam name="T"></typeparam>
17         /// <param name="value"></param>
18         /// <returns></returns>
19         public static T ToEnum<T>(this byte value) where T : struct, IComparable, IConvertible, IFormattable {
20             return value.ToEnum<T>(default(T));
21         }

高级用法

为了说明表示多种组合状态,拿用户拥有的权限来说明。此时需要在枚举上加[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)
时间: 2024-08-05 21:47:07

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

Java中Enum枚举的使用

注意项: 1.在switch中使用枚举能使代码的可读性更强. 2.如果要自定义方法,那么必须在enum实例序列的最后添加分号.而且Java要求必须先定义enum实例. 3.所有的枚举都继承自java.lang.Enum类,由于Java不支持多继承,所以枚举对象不能再继承其他类. 4.如果想让枚举对应值,那么要写构造方法,也可以再覆盖toString()方法

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

阅读目录 基本介绍 使用注意 使用方法 扩展用法 本文主要是我在项目中对C#枚举的使用心得,如有不足的地方欢迎您指出. 一.基本介绍  枚举是由一组特定常量构成的一组数据结构,是值类型的一种特殊形式,当需要一个由指定常量集合组成的数据类型时,使用枚举类型.枚举声明可以显式地声明 byte.sbyte.short.ushort.int.uint.long 或 ulong 类型作为对应的基础类型.没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int. 在代码中使用枚举,可以将以前笨拙的代

开发中巧用Enum枚举类型

在实际开发中,在数据库表设计中,我们往往习惯于用一个Int类型的State字段去表示数据的状态,这个字段很方便去表示这条数据的状态,但是又不愿意去建一张这个State字段的外键表去解释状态.(这一类型表状态的字段可能还会有很多,这里只是举个例)   我们一般会把这个State字段当成一个约定,去在项目中应用(比如:0:启用,1:禁用) 在后台管理或其它地方显示Int类型对应的实际状态时,再到公共类中去写一个方法,里面用一个switch...case去返回对应的中文解释. http://www.d

C#中的枚举类型(enum type)

ylbtech 原文 C#中的枚举类型(enum type) 概念 枚举类型(enum type)是具有一组命名常量的独特的值类型.在以下示例中: enum Color { Red, Green, Blue } 声明一个名为 Color 的枚举类型,该类型具有三个成员:Red.Green 和 Blue. 枚举具体是怎么声明呢?枚举声明用于声明新的枚举类型.枚举声明以关键字 enum 开始,然后定义该枚举类型的名称.可访问性.基础类型和成员.具体格式: 修饰词(new.public.protect

C# 中的枚举类型 enum (属于值类型)

原文 C# 中的枚举类型 enum (属于值类型) C# 支持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace enumType { enum Season // enum 类型定义在 class 外面 { Spring, Summer, Fall, Winter // 最后一个元素后面

Android中Enum(枚举)的使用

简介 enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类).枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称.枚举类型的每一个值都将映射到 protected Enum(String name, int ordi

两种项目中可用的单例模式

一个正常的饿汉单例模式 //CEO,饿汉单例模式 public class CEO extends Staff{ private static final CEO mCeo = new CEO(); //构造函数私有 private CEO(){ } //公有的静态函数,对外暴露获取单例对象的接口 public static CEO getCeo(){ return mCeo; } @Override public void work(){ //管理VP } } 这种最简单的单例模式存在资源消耗

java之enum枚举(2015年05月28日)

背景: 今天启动了一个新的项目,由于要从之前的旧项目中拿过来一些代码,所以就看了下公司之前项目代码,发现有定义的常量类,也有枚举类,然后就在想着两者的功能差不多,那他们之间到底有什么区别呢,所以就决定了解下enum枚举   一.简介 Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型. 二.基本用法 1.作为常量使用 一个完整的枚举类型示例 /** * 枚举 * @author Dreyer * @since 1.0 * @dat

java项目中可能会使用到的jar包解释

一.Struts2 用的版本是struts2.3.1.1 一个简单的Struts项目所需的jar包有如下8个 1. struts2-core-2.3.1.1.jar: Struts2的核心类库. 2. xwork-core-2.3.1.1.jar: XWork核心类,XWork是一个标准的command模式实现,并且完全从web层剥离出来.WebWork被构建在Xwork上,而Struts2由Struts1和WebWork两个经典的MVC框架发展而来. 3. ognl-3.0.3.jar: 支持