C# 中枚举类型是一种值类型,目前(vs2012)还不能用于泛型。

此类型最多的用处是标识一组相同类型的状态量或常量,比如:

状态量

示例一

  [Flags]
public enum ConnectionState
{
Closed = 0,
Open = 1,
Connecting = 2,
Executing = 4,
Fetching = 8,
Broken = 16,
}

常量

示例二

  [Flags]
[ComVisible(true)]
[Serializable]
public enum FileAttributes
{
ReadOnly = 1,
Hidden = 2,
System = 4,
Directory = 16,
Archive = 32,
Device = 64,
Normal = 128,
Temporary = 256,
SparseFile = 512,
ReparsePoint = 1024,
Compressed = 2048,
Offline = 4096,
NotContentIndexed = 8192,
Encrypted = 16384,
[ComVisible(false)] IntegrityStream = 32768,
[ComVisible(false)] NoScrubData = 131072,
}

在使用中,平时使用频率最多的是:使用switch case 语句来判断枚举中的一个值,比如:

示例三

    enum ActionStep
{
/// <summary>
/// 第一步:打开主页
/// </summary>
Home, /// <summary>
/// 第二步:查找输入框与提交按钮,输入关键字后提交
/// </summary>
FindAndQuery, /// <summary>
/// 第三步:查找指定连接,找到后导航到它
/// </summary>
Search, /// <summary>
/// 第四步:等待15秒后关闭
/// </summary>
WaittingForClose, End
}
                switch (action.Step)
{
case ActionStep.Home:
Navigate(task.Home);
break;
case ActionStep.FindAndQuery:
InputAndSubmit(task);
break;
case ActionStep.Search:
SearchTarget(task);
break;
case ActionStep.WaittingForClose:
WaitForClose(task);
break;
}

然而,我们有时候也需要多状态的情况,比如:文件属性 FileAttributes。

那么,如何来操作呢?

正常的思路是声明一个变量,在需要的时候进行    操作。(不是还有hasFlag嘛?......),比如:C# Enum设计和使用的相关技巧 中的示例

示例四

 例如定义了权限Enum Permission:

[Flags]

public enum Permission{

      Select = 1,

      Edit = 2,

      Delete = 4,

      View = 8,   

      All = Select | Edit | Delete | View

  } 

可以采用这个函数进行计算:

public static Permission ClearFlag(Permission value, Permission flag)  

{       

    value = value & (Permission.All^ flag);

    return value;

}

使用起来应该很方便,但是如果遇到,像下面的情况

示例五

 [Flags]
public enum AuthorState
{
BlogListDownloading = 1,
BlogListParsing = 2, BlogDownloading = 4,
BlogParsing = 8,
BlogWritting = 16, MetaDownloading = 32,
MetaParsing = 64,
MetaWritting = 128,
MetasParsedDone = 2048,//所的的元素解析全部完成 DownloadList = 256,
CheckUpdate = 512,
NeedUpdate = 1024//需要更新 }
    /// <summary>
/// 状态辅助类
/// </summary>
public class EnumHelper
{
private AuthorState _state; /// <summary>
/// 添加一个状态
/// </summary>
/// <param name="state"></param>
public void In(AuthorState state)
{
if (!Include(state))
_state |= state;
} /// <summary>
/// 删除一个状态
/// </summary>
/// <param name="state"></param>
public void Out(AuthorState state)
{
if(!Include(state))
_state ^= state;
//_state ^= state;
} /// <summary>
/// 判断一个状态是否在其中
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public bool Include(AuthorState state)
{
return (_state & state) == state;
}
}
            State.In(AuthorState.DownloadList);
_download.DownloadBlogList(url);
State.Out(AuthorState.DownloadList);

即,添加了一个状态,在之后的操作中会去除这个状态。

然而,我在写出了示例五之后总感觉这样做代码量增加太多了,虽然有智能提示。很是怀想delphi下的 In 操作:

示例六

procedure TForm1.Edit1KeyPress(Sender: TObject; var..Key: Char);
begin
  if not(key in['0'..'9',#8])then
  begin
    key:=#0;
    MessageBeep(1); //Beep; 调用系统声音也行!
  end;
end;

C#中的In是不会让你这么用的,那么,要怎么办?扩展!扩展枚举,增加一些方法

google了一下,找到了 如何:为枚举创建新方法(C# 编程指南)

下面是我修改之后的代码

示例七

[Flags]
public enum MyEnum
{
Zero =1 , One = 2, Two = 4, Three =8
}

扩展

    public static class Extensions
{
public static MyEnum Host = MyEnum.One; public static bool Contained(this MyEnum value)
{
return (Host & value) == value;
} public static void Add(this MyEnum value)
{
if (value.Contained()) return;
Host |= value;
} public static void Remove(this MyEnum value)
{
if (value.Contained())
Host ^= value;
}
}

使用方法

    public class  TestCls
{
private MyEnum _initValue = MyEnum.One; public void Test(MyEnum value)
{
Extensions.Host = _initValue;//控制变量
value.Contained();
value.Add();
value.Remove();
}
}

那么,好吧,你现在会用了。

示例八

            MyEnum.One.Add();
MyEnum.One.Remove();

去吧,骚年,去Coding吧

原创C# 枚举 多状态 操作的更多相关文章

  1. shell 递归枚举文件并操作

    递归枚举文件并操作 #!/bin/bash CURDIR=$(cd $(dirname $0); pwd) export GOPATH=$CURDIR/.. echo GOPATH=$GOPATH c ...

  2. 通过数组和枚举简化GPIO操作编码(转)

    源: 通过数组和枚举简化GPIO操作编码

  3. Java8 新特性 Steam() 中间有状态操作

    中间有状态操作 Java8 新特性 Stream 练习实例   中间操作,就是把数据处理成自己想要的类型,并且有状态操作,是在所有的数据基础上进行操作的.比如dictinct(去重),sorted(排 ...

  4. Codeforces Round #191 (Div. 2) A. Flipping Game【*枚举/DP/每次操作可将区间[i,j](1=<i<=j<=n)内牌的状态翻转(即0变1,1变0),求一次翻转操作后,1的个数尽量多】

    A. Flipping Game     time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. 通过数组和枚举简化GPIO操作编码

    在工作中,经常遇到大量使用GPIO作为数字量输入输出来控制设备或采集状态,每次定义操作不同的GPIO针脚既麻烦又容易出错,于是就想要简化操作过程.对于数字量输入来说就是采集对应针脚的状态:而输出则是根 ...

  6. Effective Objective-C 2.0 — 第五条用枚举表示状态、选项、状态码 (未看完)

    枚举是一种常量命名方式.某个对象所经历的各种状态就可以定义为一个简单的枚举集.(enumeration set) 编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增1.实现枚举所用的数据类型取决 ...

  7. 从零开始学android开发- 应用程序窗体显示状态操作requestWindowFeature

    我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其他的需求,今天这一讲就是如何控制Android应用程序的窗体显示. 首先介绍一个重要方法那就是requestWindowFeat ...

  8. Android开发之应用程序窗体显示状态操作(requestWindowFeature()的应用)

    转自:http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html 我们在开发程序是经常会需要软件全屏显示.自定义标题(使用按钮等控件)和其 ...

  9. Android 应用程序窗口显示状态操作(requestWindowFeature()的应用)

     我们在开发程序是常常会须要软件全屏显示.自己定义标题(使用button等控件)和其它的需求,今天这一讲就是怎样控制Android应用程序的窗口显示. 首先介绍一个重要方法那就是requestWi ...

随机推荐

  1. SQLite入门与分析(八)---存储模型(1)

    写在前面:SQLite作为嵌入式数据库,通常针对的应用的数据量相对于通常DBMS的数据量是较小的.所以它的存储模型设计得非常简单,总的来说,SQLite把一个数据文件分成若干大小相等的页面,然后以B树 ...

  2. 149. Max Points on a Line

    题目: Given n points on a 2D plane, find the maximum number of points that lie on the same straight li ...

  3. js 中var that=this

    js中经常出现var that=this,为什么这么做? http://stackoverflow.com/questions/4886632/what-does-var-that-this-mean ...

  4. 捉虫记:SHGetSpecialFolderPath返回错误码为2

    通常我们想获得系统的一些路径时,都会使用一些Shell函数.比如SHGetSpecialFolderPath,SHGetFolderPath,SHGetKnownFolderPath等,传入我们想要的 ...

  5. FORM Save : ORA-01403 FRM-40735 ORA-06502

    症状: FORM开发后挂上服务器后,运行保存按键提示: ORA-01403: 未找到任何数据 ----------------------------------------------------- ...

  6. 结构体dtuple_t

    /* SQL data tuple struct */ typedef struct dtuple_struct dtuple_t; /** Structure for an SQL data tup ...

  7. Linux kernel ‘uio_mmap_physical’函数缓冲区溢出漏洞

    漏洞名称: Linux kernel ‘uio_mmap_physical’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-154 发布时间: 2013-11-13 更新时间: 201 ...

  8. 常用的Web服务器

    常用的Web服务器有IIS.Apache.Tomcat.Jboss.Resin.Weblogic.WebSpher IISIIS服务是Windows产品自带的一种免费的Web服务器,安装配置简单,主要 ...

  9. 谈谈分布式事务之二:基于DTC的分布式事务管理模型[下篇]

    [续上篇] 当基于LTM或者KTM的事务提升到基于DTC的分布式事务后,DTC成为了本机所有事务型资源管理器的管理者:此外,当一个事务型操作超出了本机的范 围,出现了跨机器的调用后,本机的DTC需要于 ...

  10. Oracle的dmp文件的导入

    项目开始拿到了dmp文件,数据库用的是10g的,但是尽然没导成功,后来想可能导出的时候用11导出的,决定试一下. 正好自己的机器是11的客户端,结果不识别imp命令,到安装目录下的bin文件夹下看尽然 ...