举个例子:我有如下的一个需求,当我想要取得用户信息的时候,会先从本地缓存中查找,找不到然后从分布式缓存中查找,最后找不到再从数据库中查询。但是有些场景我又不需要查询数据库。

所以我想建立如下这种模型。

public UserEntity  GetUserInfo(List<DataSource>  dataSources)
{
var xxxx = new UserEntity();
if(dataSources.Any(DataSource.Local)
{
//从本地缓存中获取
return xxxx;
} if(dataSources.Any(DataSource.Distribution)
{
//从分布式缓存中获取
//更新本地缓存
return xxxx;
} if(dataSources.Any(DataSource.DB)
{
//从DB中获取
//更新分布式缓存
//更新本地缓存
}
return xxxx;
}

但是每次调用者都去构建一个List,比较麻烦,此时我们可以使用枚举中的Flags特性,修改程序如下:

首先是枚举的定义上,要加上   [Flags] 特性标签,并且定义 一般都是 2的n次方,主要是便于位移运算

    /// <summary>
/// 数据取得地方
/// </summary>
[Flags]
public enum DataSource
{
/// <summary>
/// 本地缓存
/// </summary>
[Description("本地缓存")]
LocalCache = 1, /// <summary>
/// 分布式缓存
/// </summary>
[Description("分布式缓存")]
DistributeCache = 2, /// <summary>
/// 数据库
/// </summary>
[Description("数据库")]
DB = 4,
}

修改代码:

public UserEntity  GetUserInfo(DataSource dataSources)
{
var xxxx = new UserEntity();
if(dataSources.HasFlags(DataSource.Local)
{
//从本地缓存中获取
return xxxx;
} if(dataSources.HasFlags(DataSource.Distribution)
{
//从分布式缓存中获取
//更新本地缓存
return xxxx;
} if(dataSources.HasFlags(DataSource.DB)
{
//从DB中获取
//更新分布式缓存
//更新本地缓存
}
return xxxx;
}

调用的地方,可以通过“|”来指定,例如我只想用分布式缓存和数据库,那么:

var userInfo = GetUserInfo(DataSource.Distribution | DataSource.DB);

使用C#的Flags特性的更多相关文章

  1. C#枚举中使用Flags特性

    .NET中的枚举我们一般有两种用法,一是表示唯一的元素序列:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,这样我们就可以用"或"运算符组合 ...

  2. enum的应用及flags特性

    enum的作用不做描述,这是C#的基础 设置enum 很简单,本文不做讨论. 但是enum设置值有种特殊方式,如 enum en { a=, b=, c=, d=, e=, …… } 你会发现这个枚举 ...

  3. 2019-9-2-C#枚举中使用Flags特性

    title author date CreateTime categories C#枚举中使用Flags特性 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 1 ...

  4. C#枚举中使用Flags特性

    如果对一个值可以包含多个,那么可以使用枚举,加上Flags 本文告诉大家如何写一个 Flags. 在写前,需要知道一些基础知识,取反.或.与,如果不知道的话,请去看看基础. 当然,这些太复杂了,我也不 ...

  5. 【C#进阶系列】18 特性Attribute

    这个东西有的叫定制特性,然而我喜欢直接叫特性,但是这样的话一些人不知道我说的是什么,如果我说是Attribute的话那么知道的或者用过的就都懂了. 还记得讲到枚举和位标志那一章,关于位标志,有一个[F ...

  6. 你必须知道的.NET之特性和属性(转)

    1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定 ...

  7. C# 位域[flags] 转

    C# 位域[flags] .NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,例如: ...

  8. .NET之特性和属性

    1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定 ...

  9. c#中[Flags] 枚举类型定义问题_百度知道

    [Flags]的微软解释是“指示可以将枚举作为位域(即一组标志)处理.”其实就是在编写枚举类型时,上面附上Flags特性后,用该枚举变量是既可以象整数一样进行按位的“|”或者按位的“&”操作了 ...

随机推荐

  1. java 工程编码格式由GBK转化成utf-8 (转载)

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  2. Docker 跨主机网络 overlay(十六)

    目录 一.跨主机网络概述 二.准备 overlay 环境 1.环境描述 2.创建 consul 3.修改 docker 配置文件 4.准备就绪 三.创建 overlay 网络 1.在 host1 中创 ...

  3. Zabbix部分监控指标

    MySQL请求流量带宽.MySQL响应流量带宽.CPU使用率.内存利用率.网卡流量等.

  4. 2.app自动化测试--adb常用API

    adb常用API  Driver.current_activity 获取当前运行应用界面的启动名 Driver.current_package 获取当前运行应用的包名 Driver.contexts ...

  5. 51.Qt-使用ajax获取ashx接口的post数据

    由于当前C++项目需要使用ajax库去post调用ashx接口,接口地址如下所示: 需要传递的参数如下: 然后发现qml比较好调用ajax.js库,所以本章通过C++界面去获取qml方法来实现调用as ...

  6. kubespray部署k8s

    0.把外网的/usr/local/bin/*拷过来覆盖 1.把部署好的集群的 calicoctl cni-plugins-linux-amd64-v0.8.1.tgz kubeadm-v1.16.3- ...

  7. WUSTOJ 1247: 递增或递减排序(Java)

    1247: 递增或递减排序 题目   有n个整数,求它的递增排序序列或递减排序序列.更多内容点击标题. 分析 统一升序排序,输出的时候做区分. 先区分是升序还是降序,调用库函数. 代码   方法1,将 ...

  8. shell习题第27题:带选项的增删用户脚本

    [题目要求] 写一个支持选项的增加或删除用户的shell脚本 #!/bin/bash ]; then echo "Wrong, use bash $0 --add username, or ...

  9. rgba()和opacity的比较(转)

    https://blog.csdn.net/u014150409/article/details/44906767

  10. CSS定位以及z-index属性(层叠性)的详解(转)

    https://blog.csdn.net/weixin_41342585/article/details/79484879